【问题标题】:Add delay between each item in an array when looping over array循环遍历数组时在数组中的每个项目之间添加延迟
【发布时间】:2022-07-19 20:43:48
【问题描述】:

我有一个被调用的异步函数,它遍历数组并为每个项目调用一个函数。

在这个例子中,函数正在访问一个 API 端点,我需要等待一个项目完成,然后再移动到下一个。

但是,当前发生的情况是每个函数都在大致相同的时间被调用,这导致 api 响应出现问题。所以我需要在每个请求之间等待 1 秒。

这是我目前拥有的

const delayedLoop = async () => {
  const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));

  const myAsyncFunc = async (i) => {
    console.log(`item ${i}`);
    await delay(0);
    return true;
  };

  const arr = ['one', 'two', 'three'];

  const promises = arr.map(
    (_, i) =>
      new Promise((resolve) =>
        setTimeout(async () => {
          await myAsyncFunc(i);
          resolve(true);
        }, 1000),
      ),
  );
  return Promise.all(promises);
}

const myFunc = async () => {
  console.log('START');
  await delayedLoop();
  console.log('FINISH');
}

myFunc();

会发生什么;

  • 日志START
  • 等待 1 秒
  • 将所有item ${i} 一起记录(中间没有延迟)
  • 立即记录FINISH

我想要发生的是

  • 日志START
  • 等待 1 秒
  • 日志item 1
  • 等待 1 秒
  • 日志item 2
  • 等待 1 秒
  • 日志item 3
  • 立即记录FINISH

查看JSFiddle 以了解它的实际应用

【问题讨论】:

  • await delay(0); 似乎是问题所在。我觉得应该是await delay(1000);
  • 这只是延长了最后一个item ${i}日志和FINISH日志之间的时间,见这里jsfiddle.net/a4pu6s7q
  • 哦。那为什么还存在这个功能呢?
  • 只是为了模拟api调用,因为它是一个执行一些逻辑的异步函数
  • @EmilKarlsson 不,delay(0) 不是问题所在。问题是 arr.map() 同时创建和启动所有 Promise ...

标签: javascript reactjs


【解决方案1】:

你可以这样做,就像这样,使用一个简单的 for 循环:

const delayedLoop = async () => {
  const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));

  const myAsyncFunc = async (i) => {
    console.log(`item ${i}`);
    return true;
  };

  const arr = ['one', 'two', 'three'];
  for(let i=0; i < arr.length; i++) {
     await myAsyncFunc(i);
     await delay(1000);
  }
}

const myFunc = async () => {
  console.log('START');
  await delayedLoop();
  console.log('FINISH');
}

myFunc();

【讨论】:

  • 谢谢,这完美!正如另一条评论中提到的,我没有意识到 arr.map 同时启动所有承诺,并且使用 for 循环是首选方法!
猜你喜欢
  • 2019-01-17
  • 1970-01-01
  • 2016-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多