我有这个:
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
?
答案 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) );