我有一个承诺链,其中第一个承诺会导致失败,但即便如此,第二个承诺也会成功执行,而正如预期的那样应该失败......
我做的很简单:
dummyPromise().then(success, error).then(success, error);
所以如果第一个执行错误,则应该执行后续错误,但得到的是:
1. error
2. success
为什么会这样?
答案 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);
});