Ste*_*ler 25 chain angularjs angular-promise
在下面的代码片段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"); });
});Run Code Online (Sandbox Code Playgroud)
<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>Run Code Online (Sandbox Code Playgroud)
Cha*_*ani 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"); });
});
Run Code Online (Sandbox Code Playgroud)
har*_*shr 15
将成功/失败视为try/catch
try{
var val = dummyPromise();
} catch (e){
val = "SomeValue";
}
Run Code Online (Sandbox Code Playgroud)
如果catch没有抛出异常,则认为错误被处理,因此外部调用函数没有看到内部函数中发生的错误.
类似的事情发生在这里,你必须return $q.reject();从承诺返回,以便链中的下一个承诺也失败.请参阅示例plunker:http://plnkr.co/edit/porOG8qVg2GkeddzVHu3?p = preview
原因是:您的错误处理程序可能会采取措施来纠正错误.在你的错误函数中你处理错误,如果没有另外指定,它将返回一个新的promise,它被解决.因此,默认情况下使下一个承诺失败是不合理的(try-catch类比).
顺便说一句,如果您感觉到错误情况,您$q.reject()甚至可以从成功处理程序返回,以使链中的下一个承诺失败.您正在捕获错误并处理它 - 因此它将转到成功处理程序.如果你想拒绝它,你必须通过返回$ q.reject();
要对注释求和,要在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
Run Code Online (Sandbox Code Playgroud)
要么
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
Run Code Online (Sandbox Code Playgroud)
This api should be used to forward rejection in a chain of promises.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11836 次 |
| 最近记录: |