проверете дали изискваният JSON е валиден - възел

Ако ми трябва файл като

require('file.json'); 

как да проверя дали JSON е валиден? опитай да хванеш? Използвам bluebird обещания, така че точно сега се връща

 Promise.resolve(require('file.json')); 

и bluebird хваща, ако файлът не е намерен, но също трябва да проверя здравината на JSON. Разбирам, че можете просто да предадете JSON.parse на thenable, ако самият файл се връща като низ от FS или каквото и да е, но нямам нищо против кеширането и изискването би било по-бързо


person antigirl    schedule 13.04.2015    source източник
comment
require е синхронен, няма нужда да го увивате в обещание   -  person Esailija    schedule 14.04.2015
comment
Като добавим към казаното от Esailija - ако имате синхронен require, когато вашият сървър стартира и той се провали - вие искате да хвърли   -  person Benjamin Gruenbaum    schedule 14.04.2015
comment
Трябва да върна обещание, тъй като е в дълга .then верига   -  person antigirl    schedule 14.04.2015


Отговори (2)


Вие търсите функция Bluebird try. Ако използвате resolve, повикването require() може да изведе, преди резултатът му да бъде обвит в обещание.

Promise.try(require, 'file.json')
Promise.try(() => require('file.json')) // Bluebird 3.0

Алтернативно използвайте

Promise.resolve('file.json').then(require)
// or
Promise.method(require)('file.json')
person Bergi    schedule 13.04.2015
comment
Този формуляр ще бъде отхвърлен в 3.0 btw : -) - person Esailija; 14.04.2015
comment
@Esailija: Къде мога да намеря информация за това? API.md в клона 3.0 все още не е актуализиран... Винаги ли трябва да използваме масиви? - person Bergi; 14.04.2015
comment
Просто е неудобно. И със стрелките само да изпълняват функция не е толкова лошо Promise.try(_ => require('file.json')) - person Esailija; 14.04.2015
comment
@Esailija: Хм, харесва ми. Разбира се, има алтернативи с две повиквания... - person Bergi; 14.04.2015

Проблемът с

Promise.resolve(require('file.json')); 

е, че работи като

var obj = require('file.json'); 
Promise.resolve(obj); 

което означава, че ако require хвърли, обещанието няма начин да го хване. Вместо това бих препоръчал да направите

new Promise(function(resolve){
    resolve(require('file.json'));
})

Това изпълнява require от обещание, така че хвърлената грешка ще бъде уловена правилно.

person loganfsmyth    schedule 13.04.2015