等到所有请求调用都返回后再继续

时间:2021-02-23 14:14:20

标签: javascript node.js typescript asynchronous async-await

我有一个程序可以执行此操作:

async function run() {

  for (i of object) {
   request("https://www." + i + ".mydomain.com")
   await wait(250) // synchronous, to prevent API spam
  }

  // HERE
  moveOn()
}

在运行 moveOn() 之前如何等待所有请求的响应?

2 个答案:

答案 0 :(得分:1)

使用可与 got() 等承诺一起使用的 http 请求库:

const got = require('got');

async function run() {

  let promises = [];
  for (let i of object) {
    promises.push(got("https://www." + i + ".mydomain.com"));
    await wait(250) // slight delay, to prevent API spam
  }
  let results = await Promise.all(promises);

  // HERE
  moveOn()
}

这里还有一些其他相关要点。

  1. request() 库已deprecated,不推荐用于新代码。
  2. 有一个推荐的替代库列表,它们都是基于 Promise 的 here
  3. 该列表中我个人最喜欢的是 got(),它支持 request() 库所做的大多数选项,但将一些东西包装在更容易使用的基于 Promise 的 API 中(在我看来)并且非常支持未来的发展。
  4. 请求之间硬编码的 250 毫秒等待有点暴力。最好了解目标主机的实际限制和对那些实际限制的代码,这些实际限制可能类似于最大 n 个请求/秒或同时进行中不超过 n 个请求或类似的东西和有一些软件包可以帮助您实现代码以解决这些限制。
  5. 如果其中一个请求出现错误,您还需要有意识地决定计划是什么。如果任何一个请求有错误,此处显示的结构将中止 run() 函数。如果您想做一些不同的事情,您需要使用 await got()try/catch 捕获错误,然后在 catch 块中处理错误。

答案 1 :(得分:0)

您可以使用 axios()got() 等。 请尝试这样:

async function run() {
  let count = 0;

  for (i of object) {
   axios("https://www." + i + ".mydomain.com")
    .then(res => {
     count++;
     // Your code    
    })
    .catch(err => {
     count++;
    });

   await wait(250) // synchronous, to prevent API spam
  }

  // HERE
  setInterval(() => {
   if (count === object.length) {
    count = 0;
    moveOn()
   }
  }, 250);
}
相关问题