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