在第一个返回错误后执行Promise chain success

时间:2014-07-01 09:36:46

标签: angularjs promise angular-promise

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

PLUNKER LINK

我做的很简单:

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

所以如果第一个执行错误,则应该执行后续错误,但得到的是:

 1. error
 2. success

为什么会这样?

3 个答案:

答案 0 :(得分:4)

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

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

您正在捕获错误并对其进行处理 - 因此它将转到成功处理程序。

答案 1 :(得分:3)

您必须从承诺返回return $q.reject();,以便链中的下一个承诺也会失败。请参见forked plunker:http://plnkr.co/edit/porOG8qVg2GkeddzVHu3?p=preview

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

答案 2 :(得分:1)

这是承诺的工作方式。在您的错误 -function中处理错误,如果没有另外指定,它将返回一个已解决的新promise。如果你想拒绝它,你可以通过返回$q.reject();来做到这一点 看看documentation。我发现$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);
});