[英]NodeJS wait for loop to finish (async / await / promisse)
我正在尝试创建一个循环来获取API中的一些信息,首先我需要这个循环来等待请求完成并在继续下一个数组值之后,在循环完成后,我需要它来调用该函数每 5 秒再次,但仅在前一个呼叫结束后。
像这样的东西:
let ids = [1, 2];
async function getInfoAPI(ids) {
for (const id of ids){
const apiInfo = await fetch(`https://apiurl/${id}`);
const infoJSON = await apiInfo.json();
//Do more things here
}
}
现在我需要调用该函数并等待循环完成。 循环完成后等待 5 秒,然后再次调用 getInfoFromAPI 函数。 我尝试了 setInterval 但如果循环由于某种原因需要超过 5 秒的响应时间,即使它没有完成前一个循环,也会再次调用 getInfoFromAPI。
setInterval(function(){
getInfoAPI(ids);
}, 5000);
有什么办法可以使用承诺或类似的东西来做到这一点?
谢谢
你可以这样做:
function run() {
getInfo(...).then(() => {
setTimeout(run, 5000)
});
}
run().catch(err => {
console.log(err);
});
或者,我更喜欢使用setTimeout()
的承诺版本。 我是最新版本的 nodejs,您可以使用timersPromises.setTimeout()
并返回一个承诺:
import { setTimeout } from 'timers/promises';
async function run() {
await getInfo(...)
await setTimeout(5000);
return run();
}
run().catch(err => {
console.log(err);
});
或者,使用带有await
的while
循环:
import { setTimeout } from 'timers/promises';
async function run() {
while (true) {
await getInfo(...)
await setTimeout(5000);
}
}
run().catch(err => {
console.log(err);
});
您可以通过导入 NodeJs 16+ 附带的基于 promise 的setTimeout
并按如下方式使用它来实现这一点:
进口:
import { setTimeout } from "timers/promises"
利用:
while (true) {
await getInfoAPI(ids);
await setTimeout(5000);
}
使用递归:
async function getInfoPeriodically() {
await getInfoAPI(ids);
setTimeout(() => {
getInfoPeriodically()
}, 5000);
}
您可以添加参数来自定义此函数/传入值,但这就是想法。
为什么不尝试使用Promise.all
或Promise.allSettled
? 有了它,您可以使用并发来一次获取所有数据,而不是一个一个地获取。 如果你需要一个一个地做,我建议你使用for-await...of
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.