[英]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.