簡體   English   中英

限制一個 javascript forEach 循環

[英]Limiting a javascript forEach loop

我有一些嵌套的 Node.js forEach 循環正在達到 API 速率限制器,我想減慢它們的速度,以免它們達到速率限制。 我嘗試在循環結束時添加一個setTimeout ,但這對請求的速度完全沒有影響。 理想情況下,我可以每 2 秒發送一次請求。 我怎樣才能做到這一點? 網上的一切似乎都在談論限制 API 的速率,但在發送端卻沒有。

要延遲循環,首先,您的 function 必須是async

然后,您可以等待2 秒后解決的 promise。 這樣的延遲可以像這樣作為單行插入:

await new Promise(resolve => setTimeout(resolve, 2000));

...或者作為一個方便的 function 像:

const delay = time => new Promise(resolve => setTimeout(resolve, time));

...然后可以在循環中使用,例如:

async function fetchEverything() {
   for (let thing of things) {
      await fetchThing(thing);
      await delay(2000);
   }
}

您可以在Array上進行通用擴展,可以在每次迭代之間插入延遲,您需要使 function async ,以便您可以等待它(因此知道它何時完成)。

 Array.prototype.forEachLimited = async function(fn, timeBetweenCallsMs){ const delay = async () => new Promise(resolve => setTimeout(resolve, timeBetweenCallsMs)); for(var i=0;i<this.length;i++){ fn(this[i]); await delay(); } }; (async function(){ var myArr = [1,2,3,4,5]; await myArr.forEachLimited(i => console.log(i), 2000); console.log("Finished"); })();

有些人可能不贊成將它添加到Array.prototype中,它的工作原理與將數組作為參數的普通 function 一樣,因此無需將其添加到Array.prototype即可

 async function forEachLimited(arr, fn, timeBetweenCallsMs) { const delay = async() => new Promise(resolve => setTimeout(resolve, timeBetweenCallsMs)); for (var i = 0; i < arr.length; i++) { fn(arr[i]); await delay(); } }; (async function() { var myArr = [1, 2, 3, 4, 5]; await forEachLimited(myArr, i => console.log(i), 2000); console.log("Finished"); })();

暫無
暫無

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

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