等待所有承诺在循环中完成

时间:2016-05-13 15:22:24

标签: javascript promise axios

我使用the axios承诺库,但我认为我的问题更为普遍。现在,我循环遍历一些数据并在每次迭代时进行一次REST调用 每次调用完成后,我需要将返回值添加到对象。在高层次上,它看起来像这样:

var mainObject = {};

myArrayOfData.forEach(function(singleElement){
  myUrl = singleElement.webAddress;
  axios.get(myUrl)
  .then(function(response) {
    mainObject[response.identifier] = response.value;
   });
});

console.log(convertToStringValue(mainObject));

当然,当我致电console.log mainObject尚未包含任何数据时,我们发生了什么事情,因为axios仍在接触。处理这种情况的好方法是什么?

Axios确实有一个all方法和一个姐妹spread,但如果你提前知道你将要拨打多少电话,它们似乎是有用的,而在我的情况我不知道会有多少循环迭代。

1 个答案:

答案 0 :(得分:42)

您需要收集数组中的所有承诺,然后使用axios.all

var mainObject = {},
    promises = [];

myArrayOfData.forEach(function(singleElement){
  myUrl = singleElement.webAddress;
  promises.push(axios.get(myUrl))
});

axios.all(promises).then(function(results) {
    results.forEach(function(response) {
        mainObject[response.identifier] = response.value;
    })
});

console.log(convertToStringValue(mainObject));

axios docs

中描述了它