【问题标题】:About Promise chain in ES6关于 ES6 中的 Promise 链
【发布时间】:2015-12-24 14:54:38
【问题描述】:

我对 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);

我在这里迷失的是为什么会调用finalTaskcatch() 链是否返回已解决的 Promise?

【问题讨论】:

标签: javascript promise ecmascript-6 es6-promise


【解决方案1】:

当您提供.catch() 处理程序或.then() 的第二个参数时,被拒绝的承诺已被“处理​​”。默认情况下,当您提供这样的拒绝处理程序时,promise 系统将假定拒绝已被处理并且链应该继续。

如果您不希望链继续,那么从拒绝处理程序中,您可以返回被拒绝的承诺或抛出错误。这将停止该链,直到链中的另一个拒绝处理程序。

所以,这里有你展示的链中的可能性:

1) 链中没有拒绝处理程序

链完全停止,不再执行 .then() 完成处理程序。

2) 链中有一个拒绝处理程序,它要么不返回任何内容,要么返回常规值或已履行的承诺或最终履行的承诺。

这是您的代码当前显示的内容。拒绝被视为已处理,并且链的承诺状态更改为已履行的承诺,因此调用链中的后续履行处理程序。

3) 链中有一个拒绝处理程序,它要么返回一个被拒绝的 Promise,要么抛出一个错误

返回被拒绝的承诺(或将来拒绝的承诺)或抛出新的错误(变成被拒绝的承诺)将停止对链的进一步处理,直到下一个错误处理程序。

因此,如果您将 onRejected() 处理程序更改为:

function onRejected(error) {
     console.log(error);
     throw error;    // rethrow error to stop the rest of the chain
}

然后,您的承诺链将停在那里。


了解它为什么会这样工作很重要。这使您可以处理承诺链中间的错误,并且处理错误的代码可以根据返回或抛出的内容来决定链是否继续。如果它不返回任何内容或正常值或已履行的承诺,则链的处理将继续 - 错误已被处理 - 无需停止进一步处理。

但是,如果错误比这更严重并且处理不应继续,那么拒绝处理程序可以抛出相同的错误或抛出不同的错误或返回被拒绝的承诺,并且链将跳过任何完成处理程序,直到链中的下一个拒绝处理程序。

【讨论】:

  • 这种方式与同步try {} catch (e) {}中的catch非常类似(除非重新抛出,否则会处理错误)。
猜你喜欢
  • 2017-05-24
  • 2016-11-27
  • 1970-01-01
  • 2015-05-02
  • 1970-01-01
  • 2016-12-12
  • 2015-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多