【问题标题】:AngularJS : Is this the correct way to chain promises?AngularJS:这是链接承诺的正确方法吗?
【发布时间】:2014-07-16 00:05:21
【问题描述】:

我有一个函数 foo 调用另一个函数 moreFoo 并且我想将函数调用包装在 Promise 中,以便 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');
});

然后输出:

doing foo
doing more foo
finished with all foos

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

【问题讨论】:

  • 您对“正确/最佳”的标准是什么?

标签: javascript angularjs promise chaining angular-promise


【解决方案1】:

我不知道“最佳”,但这可以通过利用 $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 返回承诺):

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

    这个例子展示了两个链接在一起的 Promise。第二个仅在第一个成功后执行。如果任一失败,则调用最后一个错误处理程序。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2020-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-14
        • 2015-09-26
        • 2020-04-07
        • 1970-01-01
        相关资源
        最近更新 更多