2015-08-11 11 views
1

db.collection.findOne - это асинхронная операция (MongoDB, но это на самом деле не имеет значения здесь), поэтому я обернуваю ее в обещание.Почему это обещание терпит неудачу?

var letsDoSomething = new Promise(function(resolve, reject){ 
    db.collection('stackoverflow').findOne({question: true}, function(err, question){ 
     resolve(question); // let's pretend we found a question here, and it is now resolving 
    }) 
}) 

letsDoSomething.then(function(myData){ // it resolves 
    console.log('foo', bar); // since 'bar' is undefined, this should fail – why doesn't it? No error messages, it goes completely silent 
}); 

Почему не отладчик выдаст ошибку, когда я пытаюсь войти bar, который просто не существует? Он просто идет poof молчание, а не слово.

Ожидаемый результат (на мой взгляд):

Что мне не хватает?

Окружающая среда:

node -v 
v0.12.4 
+0

, возможно, «притвориться, что мы нашли вопрос здесь», недостаточно, чтобы фактически решить обещание –

+0

Нет, он разрешит обещание! – subZero

+0

Используйте io.js, а не nodejs, и используйте событие 'process.on (« unhandledRejection ») или используйте библиотеку, которая выпадает, как Bluebird. –

ответ

4

Это не глотая эту ошибку, но если then или catch обработчика приводит к ошибке, то текущее обещание будет отклонено с этой ошибкой.

В вашем случае, ReferenceError брошено, но оно отвергает обещание. Вы можете увидеть фактические ошибки, распространяющиеся, приклеивание catch обработчика, как этого

new Promise(function (resolve, reject) { 
    resolve(true); 
    }) 
    .then(function (result) { 
    console.log(result, bar); 
    }) 
    .catch(function (er) { 
    console.error('Inside Catch', er); 
    }); 

Теперь вы увидите

Inside Catch [ReferenceError: bar is not defined] 

Дополнительной литературы:

  1. Why cannot I throw inside a Promise.catch handler?
Смежные вопросы