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

Javascript 为什么这个承诺默默地失败了?,javascript,node.js,promise,Javascript,Node.js,Promise,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

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时,调试器不抛出一个错误?它只是一声不响,一句话也没有

我心目中的预期结果:

console.log('foo', bar);
ReferenceError: bar is not defined
我错过了什么

环境:


它不会接受该错误,但如果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);
  });
现在你会看到

内部捕获[ReferenceError:未定义条] 进一步阅读:


也许假装我们在这里发现一个问题不足以解决承诺,它会解决承诺!使用io.js而不是nodejs,使用process.onunhandledRejection事件,或者使用像Bluebird这样的内置库。
new Promise(function (resolve, reject) {
    resolve(true);
  })
  .then(function (result) {
    console.log(result, bar);
  })
  .catch(function (er) {
    console.error('Inside Catch', er);
  });