[英]Promise chaining (angular javascript)
因此,我有一些函數可以對服務進行異步調用。 我不希望它們全部在上一個完成之后執行,但前提是前一個沒有失敗。 看起來像這樣:
var fn1 = function() {
var promise = aService.fn1();
var successCallback = function(response) {
return true;
};
var errorCallback = function() {
return false;
};
return promise.then(successCallback, errorCallback);
};
var fn2 = function() {
var promise = aService.fn2();
var successCallback = function(response) {
return true;
};
var errorCallback = function() {
return false;
};
return promise.then(successCallback, errorCallback);
};
var fn3 = function() {
var promise = aService.fn3();
var successCallback = function(response) {
return true;
};
var errorCallback = function() {
return false;
};
return promise.then(successCallback, errorCallback);
};
fn1().then(function(resp){
if (resp)
{
fn2().then(function(resp){
if (resp)
{
fn3().then(function(resp){
if (resp)
{
// all functions have been called in order were successful
}
});
}
});
}
});
如果將更多功能添加到此鏈中,最后的執行就很糟糕。 我不知道是否還有另一種方式可以構造這種方式,使其行為相同,但不會創建巨大的鏈式異步調用樹。 如果我能保持相同的縮進,那將是很好的。 謝謝!
您必須修改錯誤回調以返回$q.reject()
而不是false
,即:
var fn1 = function() {
var promise = aService.fn1();
var successCallback = function(response) {
// no return needed, unless the next stage
// requires the results of this stage
};
var errorCallback = function() {
return $q.reject();
};
return promise.then(successCallback, errorCallback);
};
鏈接變為:
fn1()
.then(function() {
return fn2();
})
.then(function() {
return fn3();
})
.then(function() {
// ALL SUCCEEDED HERE
});
實際上,您甚至不必在f1
, f2
, f3
編寫該痛苦的代碼,即以下代碼也可以完成此工作:
aService.fn1()
.then(function() {
return aService.fn2();
})
.then(function() {
return aService.fn3();
})
.then(function() {
// ALL SUCCEEDED HERE
});
如果您已經確定了服務功能,則可以將其簡短化:
aService.fn1()
.then(aService.fn2.bind(aService))
.then(aService.fn3.bind(aService))
.then(function(){
// all functions have been called in order and were successful
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.