承诺没有正确捕获错误NodeJS

时间:2016-11-10 06:30:33

标签: javascript node.js error-handling es6-promise

如果我没记错的话Promise应该在任何时候抛出一个错误时捕获错误,以便Promise.catch()可以用来处理该错误。我不记得任何例外,但是当我在setTimeout()内抛出错误时,这种方式无效。

有人可以解释为什么这不起作用?或者它只是NodeJS中的一个错误?

测试代码

// This works!
function async() {
        return new Promise(function (resolve, reject) {
                throw new Error('test');
        });
}

async().catch(function() {
        console.log('Ok: 1');
});


// This doesn't work..
function async_fail() {
        return new Promise(function (resolve, reject) {
                setTimeout(function() {
                        throw new Error('test');
                }, 1);
        });
}

async_fail().catch(function() {
        console.log('Ok: 2');
});

1 个答案:

答案 0 :(得分:0)

您永远不会捕获在setTimeout中引发的错误,因为它会对promise函数的实际执行执行异步。因此,当调用set timeout内的函数时,promise本身已经完成(没有任何调用解析或拒绝)。

如果你想根据setTimeout中的错误使承诺失败,你需要手动捕获它并调用reject:

setTimeout(function() {
     try{
          throw new Error('test');
     }catch(ex){
          reject(ex);
     }
}, 1);