链接通过for循环创建的多个promise

时间:2016-07-24 18:15:06

标签: javascript angularjs

我一直在研究this link的承诺,我理解它的想法

var parentID;

$http.get('/api/user/name')
  .then(function(response) {

  parentID = response.data['ID'];
  for (var i = 0; i < response.data['event-types'].length; i++) {
    return $http.get('/api/security/' + response.data['event-types'][i]['key']);
  }

  })
  .then(function(response) {

    // response only returns one result of the many promises from the for loop
    // do something with parentID; 

  });

但是,我的用例需要循环并发送创建超过1个承诺。我试图链接一个上面的例子,但只执行了从for循环创建的唯一一个承诺。

如何继续链接所有承诺,同时继续访问变量parentID?

2 个答案:

答案 0 :(得分:1)

您应该使用$q.all,因为它与AngularJS摘要周期集成在一起。

var parentID;

$http.get('/api/user/name')
  .then(function(response) {

      parentID = response.data['ID'];
      var promiseList = [];
      for (var i = 0; i < response.data['event-types'].length; i++) {
          var iPromise = $http.get('/api/security/' + response.data['event-types'][i]['key']);
          promiseList.push(iPromise);
      };
      return $q.all(promiseList);

  })
  .then(function(responseList) {

       console.log(responseList);

  });

来自文档:

  

所有(许诺);

     

将多个promises组合成一个promise,当所有输入promise都被解析时解析。

     

<强>参数

     

承诺的数组或散列。

     

<强>返回

     

返回将使用值的数组/散列解析的单个promise,每个值对应于promises数组/散列中相同索引/键的promise。如果任何承诺通过拒绝得到解决,则此结果承诺将被拒绝并具有相同的拒绝价值。

- AngularJS $q Service API Reference -- $q.all

答案 1 :(得分:0)

您可以使用Promise.all(),将Array.prototype.map()替换为for循环

  var parentID;

  $http.get('/api/user/name')
  .then(function(response) {    
  parentID = response.data['ID'];
  return Promise.all(response.data['event-types'].map(function(_, i) {
    return $http.get('/api/security/' + response.data['event-types'][i]['key'])
    })) 
  })
  .then(function(response) {

    // response only returns one result of the many promises from the for loop
    // do something with parentID; 

  })
  .catch(function(err) {
    console.log(err);
  });