проверить, действителен ли требуемый 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
В добавление к тому, что сказал Эсаилия - если у вас есть синхронный 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 кстати :-) - 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