【发布时间】: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