AngularJS:这是连锁承诺的正确方法吗?

时间:2014-07-16 00:05:21

标签: javascript angularjs promise chaining angular-promise

我有一个函数 foo 调用另一个函数 moreFoo 我希望在promises中包装函数调用,以便 foo moreFoo 解决后返回。这是我的解决方案:

function foo() {
  var defer = $q.defer();
  console.log('doing foo');
  moreFoo().then(defer.resolve);
  return defer.promise;
}

function moreFoo() {
  var defer = $q.defer();
  setTimeout(function() {
    console.log('doing more foo');
    defer.resolve();
  }, 2000);
  return defer.promise;
}

foo().then(function() {
  console.log('finished with all foos');
});

然后输出:

doing foo
doing more foo
finished with all foos

它似乎按预期工作。这是将这些承诺联系起来的正确/最佳方式吗?

3 个答案:

答案 0 :(得分:2)

我不知道“最好”,但通过利用$timeout它所带来的承诺,这可以大大简化......

function foo() {
  console.log('doing foo');
  return moreFoo();
}

function moreFoo() {
  return $timeout(function() {
    console.log('doing more foo');
  }, 2000);
}

foo().then(function() {
  console.log('finished with all foos');
});

答案 1 :(得分:0)

我喜欢这种方式($ timeout返回promise):

 function foo() {
      return $timeout(function(){
           console.log('doing foo');
       },2000);
 }

 function moreFoo() {
      return $timeout(function(){
           console.log('doing more foo');
       },2000);
 }        

 foo()
     .then(moreFoo)
     .then(function(){ 
          console.log('all foos done');
      }, function() {
         console.log('something went wrong');
      });

此示例显示了两个链接在一起的承诺。第二个只在第一个成功后执行。如果失败,则调用最后一个错误处理程序。

答案 2 :(得分:0)

可以同时运行,甚至不需要使用$q.all()

链接它们
$q.all([ foo(), moreFoo()]).then(function(data){
    console.log(data) /* array of responses from all resolved promises */
});

好参考:https://egghead.io/lessons/angularjs-q-all