【问题标题】:How to loop many http requests with axios in node.js如何在 node.js 中使用 axios 循环许多 http 请求
【发布时间】:2022-01-05 07:54:59
【问题描述】:

我有一个用户数组,每个用户都有一个 IP 地址。

我有一个 API,我将 IP 作为请求发送,它返回属于该 IP 的县代码。

为了获得每个用户的国家代码,我需要向每个用户发送单独的请求。

在我的代码中,我执行了异步等待,但大约需要 10 秒才能获得所有响应,如果我不执行异步等待,则根本无法获得国家代码。 我的代码:

async function getAllusers() {
  let allUsersData = await usersDao.getAllusers();

  for (let i = 0; i < allUsersData.length; i++) {
    let data = { ip: allUsersData[i].ip };
    let body = new URLSearchParams(data);
    await axios
      .post("http://myAPI", body)
      .then((res) => {
        allUsersData[i].countryCode = res.data.countryCode;
      });
  }

  return allUsersData;
}

【问题讨论】:

  • 那么,您到底在寻求什么帮助?听起来您在使用await 时确实获得了代码。 allUsersData 数组中有多少项?
  • 问题是,如果我使用 await 它会花费太多时间来处理所有响应(大约 10 秒),这是因为它在我有大约 40 个用户的每个请求后等待响应跨度>

标签: node.js api asynchronous


【解决方案1】:

如果您只是想更快地获得所有结果,您可以并行请求它们并知道它们何时全部完成Promise.all()

async function getAllusers() {
  let allUsersData = await usersDao.getAllusers();

  await Promise.all(allUsersData.map((userData, index) => {
      let body = new URLSearchParams({ip: userData.ip});
      return axios.post("http://myAPI", body).then((res) => {
          allUsersData[index].countryCode = res.data.countryCode;
      });
  }));
  return allUsersData;
}

注意,如果allUsersData 数组很大(比如超过 20 个),我不建议这样做,因为你会在目标服务器上大量请求,它可能会阻碍其性能或您可能会得到限价甚至拒绝服务。在这种情况下,您需要使用 pMap() heremapConcurrent() here 这样的代码一次发送 N 个请求(可能是 5 个)。

【讨论】:

  • 谢谢!很有帮助
  • 我想...但我是堆栈溢出的新手...而且我没有足够的声誉。
  • @YF - 你总是有足够的声望来点击你自己问题的答案上的复选标记。向上/向下箭头需要声望,但复选标记不需要声望。
  • 你说得对,谢谢。
【解决方案2】:

您可以使用Promise.all 一次性提出所有请求,而不是一一提出。

let requests = [];
for (let i = 0; i < allUsersData.length; i++) {
    let data = { ip: allUsersData[i].ip };
    let body = new URLSearchParams(data);
    requests.push(axios.post("http://myAPI", body)); // axios.post returns a Promise
  }
try {
    const results = await Promise.all(requests);
    // results now contains each request result in the same order
    // Your logic here...
}
catch (e) {
    // Handles errors
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 2020-06-07
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多