如何在for循环中进行并发api调用?

时间:2020-07-27 22:01:44

标签: javascript api concurrency axios

我有以下代码:

    Promise.resolve(axios.get(`apiwebsite.com/api?tag=${tagsArr[0]}`)),
    Promise.resolve(axios.get(`apiwebsite.com/api?tag=${tagsArr[1]}`)),
    Promise.resolve(axios.get(`apiwebsite.com/api?tag=${tagsArr[2]}`)),
  ]).then((all) => {
    res.json({"success": true, "test": all[0].data}, "test1":all[1].data, "test2":all[2].data);
  });

tagArr的长度未知。因此,我想实现某种for循环,为每个标签Arr进行API调用

for(let i = 0; i < tagsArr.length; i++) {
        Promise.resolve(axios.get(`apiwebsite.com/api?tag=${tagsArr[i]}`)),
}

现在这是问题所在。我也希望我的API调用是并发的。如何在对每个标签进行API调用并同时进行API调用时遍历tagArr?

2 个答案:

答案 0 :(得分:2)

您可以创建一个已执行的诺言数组,然后等待所有它们。

const promises = tagsArr
    .map(tag => axios.get(`apiwebsite.com/api?tag=${tag}`));

Promise.all(promises)
    .then(responses => {
        // Do your thing here...
    });

答案 1 :(得分:0)

尝试将它们放入数组并使用Promise.all:

Promise.all([
    axios.get(`apiwebsite.com/api?tag=${tagsArr[0]}`),
    axios.get(`apiwebsite.com/api?tag=${tagsArr[1]}`),
    axios.get(`apiwebsite.com/api?tag=${tagsArr[2]}`),
  ]).then((all) => {
    res.json({"success": true, "test": all[0].data}, "test1":all[1].data, "test2":all[2].data);
  });

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all