在以下代码中,将记录error 1
和success 2
代码段。如果原始延迟被拒绝,我怎样才能传播被调用的错误回调而不是被调用的成功回调。
angular.module("Foo", []);
angular
.module("Foo")
.controller("Bar", function ($q) {
var deferred = $q.defer();
deferred.reject();
deferred.promise
.then(
/*success*/function () { console.log("success 1"); },
/*error*/function () { console.log("error 1"); })
.then(
/*success*/function () { console.log("success 2"); },
/*error*/function () { console.log("error 2"); });
});

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="Foo">
<div ng-controller="Bar"></div>
</div>
&#13;
答案 0 :(得分:31)
错误通过在错误回调
中返回$q.reject
来传播
var deferred = $q.defer();
deferred.reject();
deferred.promise
.then(
/*success*/function () { console.log("success 1"); },
/*error*/function () { console.log("error 1"); return $q.reject('error 1')})
.then(
/*success*/function () { console.log("success 2"); },
/*error*/function () { console.log("error 2"); });
});
答案 1 :(得分:15)
将成功/失败视为try / catch
try{
var val = dummyPromise();
} catch (e){
val = "SomeValue";
}
如果catch没有抛出异常,则认为错误被处理,因此外部调用函数没有看到内部函数中发生的错误。
此处发生类似的事情,您必须从承诺返回return $q.reject();
,以便链中的下一个承诺也失败。请参阅示例plunker:http://plnkr.co/edit/porOG8qVg2GkeddzVHu3?p=preview
原因是:您的错误处理程序可能会采取措施更正错误。在你的错误函数中你处理错误,如果没有另外指定,它将返回一个新的promise,它被解决。因此,默认情况下使下一个承诺失败是不合理的(try-catch类比)。
顺便说一下,如果你感觉到一个错误条件,你甚至可以从 success 处理程序返回$q.reject()
,以使链中的下一个承诺失败。
您正在捕获错误并对其进行处理 - 因此它会转到成功处理程序。如果你想拒绝它,你必须通过返回$ q.reject();
答案 2 :(得分:6)
要对注释求和,要在promise链中传播错误,请执行以下操作:
1)不要为errorCallback
提供then
:
deferred.promise
.then(
/*success*/function () { console.log("success 1"); },
.then(
/*success*/function () { console.log("success 2"); },
/*error*/function () { console.log("error 2"); }); // gets called
或者
2)从$q.reject()
:
errorCallback
deferred.promise
.then(
/*success*/function () { console.log("success 1"); },
/*error*/function (err) { console.log("error 1"); return $q.reject(err); });
.then(
/*success*/function () { console.log("success 2"); },
/*error*/function () { console.log("error 2"); }); // gets called
来自angular $q.reject documentation:
This api should be used to forward rejection in a chain of promises.