for循环中的链式承诺无法正常执行

时间:2016-10-25 04:41:26

标签: angularjs angular-promise

我有可链接的承诺,它在单个系列中运行良好但现在我想在循环中调用这个串行链接但是它没有按预期工作。

查看我的demo plunker并在控制台中查看输出。

下面是我的链接承诺的结构。我想要funTwo返回的所有 publicIP ;但我想完成funThree(),然后想要获得所有 publicIP 。据我所知$q.when()在promise对象中生成一个值。

但您可以看到console.log('pA', promiseArray);之前已执行过console.log('res three');以及为什么successHandlerfinally在此之前被调用了?

我肯定错过了一些东西,可能需要在适当的位置写一个return;,请帮助我如何执行for循环中的所有函数并返回一个数据数组,然后返回可以重试的循环结束在successHandler

 MyService.funZero()
     .then(function(response) {
        console.log(response);
        var promiseArray = [];
        for(var i = 0; i < 2 ; i++) {
            console.log('I', i);
            MyService.funOne()
           .then(MyService.funTwo)
           .then(function(res2) {
                console.log('res two', res2);
                publicIP = res2.ip;
                console.log('i', publicIP);
                promiseArray.push({'ip': publicIP});
                return MyService.funThree(publicIP);
           })
           .then(function() {
                 console.log('res three');
           })
           } // for loop ends
        console.log('pA', promiseArray);
        return $q.when(promiseArray);
      })
      .then(function(res4){
          console.log('after for loop', res4);
      })
      .then(successHandler)
      .catch(errorHandler)
      .finally(final, notify);

1 个答案:

答案 0 :(得分:2)

所以,我不确定MyService.funThree究竟做了什么,但你可以通过ipArray.push({'ip': publicIP})聚合一个数组并将其返回MyService.funThree然后再返回后续函数。这里的问题是ipArray如果您正在寻找的话,则无法保证订单。{1}}这是该功能的中间部分:

ipArray = [];
for(var i = 0; i < 2 ; i++) {
  console.log('I', i);
  var promise = MyService.funOne()
    .then(MyService.funTwo)
    .then(function(res2) {
      console.log('res two', res2);
      publicIP = res2.ip;
      console.log('i', publicIP);
      ipArray.push({'ip': publicIP});
      return ipArray;
    })
    .then(MyService.funThree)
    .then(function() {
      console.log('res three');
    });

  promiseArray.push(promise);
}
console.log('pA', promiseArray);
return $q.all(promiseArray);