AngularJS:这是链接承诺的正确方法吗?

AngularJS : Is this the correct way to chain promises?

本文关键字:方法 承诺 链接 AngularJS      更新时间:2023-09-26

我有一个函数foo调用另一个函数moreFoo,我想在承诺中包装函数调用,以便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

它似乎正在正常工作。这是拴住这些承诺的正确/最好的方法吗?

我不知道"最佳",但这可以通过利用$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');
});

我喜欢这样($timeout返回承诺):

 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');
      });

这个例子展示了两个链接在一起的承诺。只有在第一个执行成功后,第二个才会执行。如果其中一个失败,则调用最后一个错误处理程序。

可以同时运行,甚至不需要使用$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