首页 文章

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

提问于
浏览
1

我有一个函数foo调用另一个函数moreFoo,我想在promises中包装函数调用,以便foo返回的promise在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');
});

然后输出:

做foo
做更多的foo
完成了所有的foos

它似乎按预期工作 . 这是连接这些承诺的正确/最佳方式吗?

3 回答

  • 0

    我不知道"best",但这可以通过利用它返回的承诺 $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');
    });
    
  • 2

    我喜欢这种方式($ 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');
          });
    

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

  • 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

相关问题