Javascript承诺链接多个错误

时间:2017-02-05 16:52:24

标签: javascript chaining

为什么我所有已解决的回调都是正确执行的,但仅限于此 1错误回调正在运行?

在这里的示例中,如果$scope.avg_respondTime我只得到一个错误,而当使用false运行时,我得到两个已解析的消息。在我的理解中,每个longOperation(true)返回一个新的promise,它处于第二个.then错误回调注册的错误状态

此示例使用Typescript编写!

.then

2 个答案:

答案 0 :(得分:1)

第一个错误处理程序捕获错误,就像常规catch块一样。如果您希望拒绝链式承诺,则必须重新抛出错误:

Promise.reject().then(() => {
  console.log(1);
}).then(() => {
  console.log(2);
}).then(null, e => {
  console.log(3);
  throw e; // <= rethrow here
}).then(null, e => {
  console.log(4);
});

答案 1 :(得分:0)

承诺可以&#34;恢复&#34;。

错误将传播到&#34; .then&#34; s链中,直到找到错误回调。当它发生时,它将执行错误回调并将返回值传递给下一个promise的解析方法。

因此,只有对promise的下一个最接近的错误回调才会被执行。

如果你想捕获链中所有可能的错误,只需将错误回调放在链的末尾,所有错误都将由它处理。

在您的代码示例中,您实际上是在创建5个承诺。原来的一个和每个&#34;。然后&#34;。第二个和第三个只有onResolved方法,后两个只有onRejected方法。

这是如何执行的:

第一承诺(op):我刚刚拒绝了。我看到我有一个延迟的承诺没有onRejected回调。所以我只是用我拒绝的相同价值来称呼它的拒绝方法。

第二个承诺:前一个承诺叫做我的拒绝方法,我也有一个延迟的承诺没有onRejected回调。所以我只是用我拒绝的相同价值来称呼它的拒绝方法。

第三承诺:之前的承诺叫做我的拒绝方法。我也有一个延期的承诺,但我的确有一个onRejected回调。我将使用我拒绝的值来调用回调,并且我将使用回调的返回值调用延迟承诺的解决方法。

第四个承诺:前一个承诺叫做我的解决方法。我有一个延迟的承诺,但它没有onResolved回调,所以我只是用我解决的值来调用它已经解析的方法。

第五承诺:前一个承诺叫我的解决方法。我解决了,没有做任何事情,因为我没有延期的承诺。