我有一个承诺链,其中第一个承诺会导致失败,但即使这样,第二个承诺也会成功执行,而正如预期的那样应该失败......
我所做的很简单:
dummyPromise().then(success, error).then(success, error);
因此,如果第一个执行错误,则应执行后续错误,但 get 是:
1. error
2. success
为什么呢??
我有一个承诺链,其中第一个承诺会导致失败,但即使这样,第二个承诺也会成功执行,而正如预期的那样应该失败......
我所做的很简单:
dummyPromise().then(success, error).then(success, error);
因此,如果第一个执行错误,则应执行后续错误,但 get 是:
1. error
2. success
为什么呢??
Nikos 的另一个答案是正确的——但我觉得这可以从同步类比中受益:
try{
var val = dummyPromise();
} catch (e){
val = "SomeValue";
}
secondHandler(val);
您正在捕获错误并处理它 - 所以它会到达成功处理程序。
return $q.reject();
你必须从一个 Promise 中返回,这样链中的下一个 Promise 也会失败。请参阅分叉的 plunker:http ://plnkr.co/edit/porOG8qVg2GkeddzVHu3?p=preview
原因很简单:您的错误处理程序可能会采取措施纠正错误。因此,让下一个承诺默认失败是不合理的。顺便说一句,如果您感觉到错误情况,您$q.reject()
甚至可以从成功处理程序返回,以使链中的下一个 Promise 失败。
这就是 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);
});