簡體   English   中英

NodeJS 等待循環完成(異步/等待/承諾)

[英]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);
});

或者,使用帶有awaitwhile循環:

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.allPromise.allSettled 有了它,您可以使用並發來一次獲取所有數據,而不是一個一個地獲取。 如果你需要一個一個地做,我建議你使用for-await...of

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM