我对ES6中的Promise链感到困惑。
function taskA() {
console.log("Task A");
throw new Error("throw Error @ Task A")
}
function taskB() {
console.log("Task B");
}
function onRejected(error) {
 console.log(error);// => "throw Error @ Task A"
}
function finalTask() {
console.log("Final Task");
}
var promise = Promise.resolve();
promise
.then(taskA)
.then(taskB)
.catch(onRejected)
.then(finalTask);

我失去的是finalTask
被召唤的原因? catch()
链是否返回已解析的Promise?
答案 0 :(得分:13)
当您为.catch()
提供.then()
处理程序或第二个参数时,被拒绝的承诺已被"处理"。默认情况下,当您提供这样的拒绝处理程序时,promise系统将假定已经处理了拒绝并且链应该继续。
如果您不希望链继续,那么从拒绝处理程序,您可以返回被拒绝的承诺或抛出错误。然后,这将阻止该链直到链中的另一个拒绝处理程序。
所以,这就是你展示链中的可能性:
1)链中没有拒绝处理程序
链完全停止,不再执行.then()
履行处理程序。
2)链中有一个拒绝处理程序,它不返回任何内容,也不返回常规值或履行的承诺或最终履行的承诺。
这是您的代码目前显示的内容。拒绝被视为已处理,链的承诺状态变为已履行的承诺,因此链中的后续履行处理程序将被调用。
3)链中有一个拒绝处理程序,它返回被拒绝的承诺或抛出错误
返回被拒绝的承诺(或将来拒绝的承诺)或抛出新的错误(变为被拒绝的承诺)将停止进一步处理链,直到下一个错误处理程序。
因此,如果您将onRejected()
处理程序更改为:
function onRejected(error) {
 console.log(error);
throw error; // rethrow error to stop the rest of the chain
}
然后,你的承诺链将停在那里。
理解为什么它以这种方式工作很重要。这允许您在promise链的中间处理错误,并且处理错误的代码根据返回或抛出的内容来决定链是否继续。如果它没有返回任何内容或正常值或履行承诺,则继续处理链 - 错误已被处理 - 无需停止进一步处理。
但是,如果错误比这更严重并且处理不应该继续,那么拒绝处理程序可以抛出相同的错误或抛出不同的错误或返回被拒绝的承诺,链将跳过任何履行处理程序,直到链中的下一个拒绝处理程序。