返回子承诺拒绝时,不会触发最高承诺.catch

时间:2016-09-27 17:58:15

标签: javascript promise

我有这个:

function sayHello() {
    return new Promise( resolve => {
       throw new Error('reject');
    });
}

new Promise(resolve => sayHello()).then(ok => console.log('ok:', ok)).catch( err => console.error('err:', err) );

.catch永远不会触发。但是,如果我在承诺中返回承诺,它会被链接,以便将最高级.then.catch重新发送给孩子.then.catch

1 个答案:

答案 0 :(得分:4)

问题在于Promise回调引发的“新错误”。在promise执行程序中输入错误不会自动拒绝它。
编辑:实际承诺执行者会在抛出异常时自动拒绝承诺。然而,这不是问题的主要原因。另外一个注意事项只会在执行者的“主”级别上起作用,因此抛出异常的任何异步作业都不会自动拒绝承诺。

发现了另一个问题 - 您的Promise链(new Promise(resolve => sayHello())...)也无效 - 您只是返回一个函数调用结果。您始终必须手动解析或拒绝您使用其标准构造函数(又名。new Promise(executorCallback))创建的Promise。

要解决其他问题,您可以使用“自动解决的承诺”,我认为这会做您想要实现的目标:

Promise.resolve(sayHello()).then(...)

所以最后,你的代码看起来应该是这样的(使用the gist你在下面的评论中通过回答发布了):

function sayHello() {
    return new Promise( (resolve,reject) => {
       reject('rawr')
    });
}

Promise.resolve(sayHello()).then(ok => console.log('ok:', ok)).catch( err => console.error('err:', err) );