我想使用$q
来运行活动,但我执行(由于与问题无关的原因)关心它们发生的顺序。我如何使用promise.then()
按顺序运行事物而不会使用重度嵌套的函数?
var myGenericFunc = function(arg1,arg2){
var defer = $q.defer();
doSomeQueryNotActualSyntax(arg1,arg2, someSuccessCallback(){
defer.resolve('result');
}
return defer.promise;
}
// then somewhere else...
var result1,result2,result3,result4;
myGenericFunc('foo','bar').then(function(res){
result1 = res;
myGenericFunc('baz','qux').then(function(res){
result2 = res;
myGenericFunc('quux','corge').then(function(res){
result3 = res;
myGenericFunc('grault','garply').then(function(res){
result4 = res;
});
});
});
});
我知道我可以命名那些嵌套函数并使用f1().then(f2).then(f3).then(f4)
但是有更好的方法吗?
答案 0 :(得分:6)
使用这样的承诺是一种反模式。考虑一下这可能与你会得到的一样好。
myGenericFunc('foo', 'bar')
.then(
function(res){
result1 = res;
return myGenericFunc('baz','qux');
})
.then(
function(res){
result2 = res;
return myGenericFunc('grault','garply');
})
.then(
function(res){
result3 = res;
return myGenericFunc('quux','corge');
})
.then(
function(res){
result4 = res;
})