AngularJS:使用$ q / defer顺序运行异步事件

时间:2014-03-18 17:22:15

标签: angularjs promise q

我想使用$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)但是有更好的方法吗?

1 个答案:

答案 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;
  })