为什么这个承诺会默默地失败?

时间:2015-08-11 10:04:42

标签: javascript node.js promise

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 沉默,而不是一个字。

预期结果(在我看来):

console.log('foo', bar);
ReferenceError: bar is not defined

我错过了什么?

环境:

node -v
v0.12.4

1 个答案:

答案 0 :(得分:4)

不会吞下该错误,但如果thencatch处理程序导致错误,那么当前的承诺将被该错误拒绝。

在您的情况下,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?