2

我有一个承诺链,其中第一个承诺会导致失败,但即使这样,第二个承诺也会成功执行,而正如预期的那样应该失败......

柱塞链接

我所做的很简单:

dummyPromise().then(success, error).then(success, error);

因此,如果第一个执行错误,则应执行后续错误,但 get 是:

 1. error
 2. success

为什么呢??

4

3 回答 3

4

Nikos 的另一个答案是正确的——但我觉得这可以从同步类比中受益:

try{
    var val = dummyPromise();
} catch (e){
    val = "SomeValue";
}
secondHandler(val);

您正在捕获错误并处理它 - 所以它会到达成功处理程序。

于 2014-07-01T09:48:45.657 回答
3

return $q.reject();你必须从一个 Promise 中返回,这样链中的下一个 Promise 也会失败。请参阅分叉的 plunker:http ://plnkr.co/edit/porOG8qVg2GkeddzVHu3?p=preview

原因很简单:您的错误处理程序可能会采取措施纠正错误。因此,让下一个承诺默认失败是不合理的。顺便说一句,如果您感觉到错误情况,您$q.reject()甚至可以从成功处理程序返回,以使链中的下一个 Promise 失败。

于 2014-07-01T09:44:10.960 回答
1

这就是 Promise 的工作方式。在您的错误函数中,您处理错误,如果没有另外指定,它将返回一个已解决的新承诺。如果你想拒绝它,你必须通过返回$q.reject(); 查看文档来做到这一点。我发现这个例子$q.reject();很好地解释了它。

promiseB = promiseA.then(function(result) {
  // success: do something and resolve promiseB
  //          with the old or a new result
  return result;
}, function(reason) {
  // error: handle the error if possible and
  //        resolve promiseB with newPromiseOrValue,
  //        otherwise forward the rejection to promiseB
  if (canHandle(reason)) {
   // handle the error and recover
   return newPromiseOrValue;
  }
  return $q.reject(reason);
});
于 2014-07-01T09:50:09.660 回答