【问题标题】:What is the correct to way to loop request with axios and async await?使用 axios 和 async await 循环请求的正确方法是什么?
【发布时间】:2021-07-06 10:40:46
【问题描述】:

我有大约 500 个要循环并从中获取数据的 URL,这些 URL 存储在 const name urls 中:

const urls = []

我想做这样的事情:

for (let i = 1; i <= url.length; i++) {
  const response = await axios.get(url);
  responseList.push(response)
}

响应列表是我在 for 循环之外的另一个常量。

这实际上是有效的,但是 eslint 有一个“no-await-in-loop”规则,这让我觉得我在这里没有做更优化的事情。

在这种情况下,最佳做法是什么?

【问题讨论】:

  • 忽略该规则。一次执行 500 个请求是没有意义的。

标签: javascript arrays performance async-await axios


【解决方案1】:

Matia 的回答只是稍作修改,记得在 promises 中返回:

const promises = urls.map(url => return axios.get(url));
const response = await Promise.all(promises);
responseList.push(...response);

否则,promise 将是一个未定义的列表。

【讨论】:

    【解决方案2】:

    其实eslint 可以很好地指出你的问题。

    通常,应该重构代码以在 一次,然后使用Promise.all() 访问结果。否则, 直到前一个操作完成后,每个后续操作才会开始 完成。

    【讨论】:

      【解决方案3】:

      您收到警告是因为您在级联而不是并行运行所有 http 调用,这非常慢。 您可以创建一个 Promise 数组,然后使用 Promise.All()

      const promises = urls.map(url => axios.get(url));
      const response = await Promise.all(promises);
      responseList.push(...response);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-20
        • 2017-12-28
        • 2018-01-28
        • 1970-01-01
        • 2021-11-15
        • 1970-01-01
        • 2018-12-16
        相关资源
        最近更新 更多