【问题标题】:Wait until all request calls are returned before continuing等到所有请求调用都返回后再继续
【发布时间】:2021-05-25 19:49:08
【问题描述】:

我有一个程序可以运行:

async function run() {

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

  // HERE
  moveOn()
}

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

【问题讨论】:

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


【解决方案1】:

使用与got() 等promise 配合使用的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() 函数是任何一个请求有错误。如果你想做一些不同的事情,你需要用try/catchawait got()捕获错误,然后在catch块中处理错误。

【讨论】:

  • 我不想“等待”实际请求,因为我希望每个请求的触发间隔几乎正好是 250 毫秒,而不是 250 毫秒以上,无论请求解决需要多长时间
  • @TomG - 好吧,你的问题在这一点上不是很清楚。我编辑了我的答案,以 250 毫秒的间隔启动请求,但允许它们同时运行,然后在您致电 moveOn() 之前等待所有结果
【解决方案2】:

您可以使用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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 2011-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多