如何在for循环中执行请求?

时间:2018-02-02 13:03:53

标签: javascript angularjs

我有一个包含请求的数组。

request = ['request1', 'request2','request3',...];

我想执行此http请求并获取值。

我做:

var values = [];
     angular.forEach(requests, function (value, key) {
        mymethod.then(function(value){
            values.push(value);
        };
    });
console.log(values);

问题,值总是包含不同的长度。我想这个数组正在执行而不等待mymethod返回anythig,因为它是异步方法。

如何获得包含所有值的正确值数组?

2 个答案:

答案 0 :(得分:1)

问题是请求是异步的,所以你需要等到它们全部完成。

由于请求是承诺,您可以使用promise.all方法:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

所以代码看起来像这样:

var values = [];
var promises = [];
angular.forEach(requests, function (value, key) {
    promises.push(mymethod.then(function(value){
        values.push(value);
    });
});
Promise.all(promises).then(function() {
  console.log(values);
});

答案 1 :(得分:0)

如果您有async await support in your environment可以使用它,或者您可以使用库对异步方法进行分组并以并行或串行方式执行它们,如https://caolan.github.io/async/

以下是如何在链接中并行发送一堆请求并在获得所有这些请求后打印json结果

async.parallel(
  urls.map(function(url) {
    return function(callback) {
      fetch(url).then(t=>t.json()).then(callback);
    };
  ), 
  function(err, results){
    console.log(results);
  }
);