所以我有几个函数都对服务进行异步调用。我不希望他们都在前一个完成后执行,但前提是前一个没有失败。它看起来像这样:
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
});
关于javascript - Promise 链(angular javascript),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28472959/