मेरे पास प्रत्येक लूप के लिए कुछ नेस्टेड नोड.जेएस हैं जो एपीआई दर सीमाओं को मार रहे हैं और मैं उन्हें धीमा करना चाहता हूं ताकि वे दर सीमा को मार न सकें। मैंने लूप के अंत में एक setTimeout
जोड़ने का प्रयास किया है लेकिन अनुरोधों की गति पर इसका कोई प्रभाव नहीं पड़ता है। आदर्श रूप से, मैं हर 2 सेकंड में एक अनुरोध भेज पाऊंगा। इसे कैसे प्राप्त किया जा सकता है? ऐसा लगता है कि ऑनलाइन सब कुछ एक एपीआई को सीमित करने के बारे में बात करता है लेकिन चीजों के भेजने के पक्ष में कुछ भी नहीं है।
2 जवाब
एक लूप में देरी करने के लिए, सबसे पहले, आपका कार्य async होना चाहिए।
फिर आप उस वादे का प्रतीक्षा कर सकते हैं जो 2 सेकंड के बाद हल हो जाता है। इस तरह की देरी को इस तरह एक-लाइनर के रूप में डाला जा सकता है:
await new Promise(resolve => setTimeout(resolve, 2000));
या एक आसान कार्य के रूप में:
const delay = time => new Promise(resolve => setTimeout(resolve, time));
... जिसे तब लूप में इस्तेमाल किया जा सकता है जैसे:
async function fetchEverything() {
for (let thing of things) {
await fetchThing(thing);
await delay(2000);
}
}
forEach
के साथ मार्गदर्शन चाहते हैं, तो कृपया यह प्रश्न देखें।
आप Array
पर एक सामान्य एक्सटेंशन बना सकते हैं जो प्रत्येक पुनरावृत्ति के बीच में देरी डाल सकता है, आप फ़ंक्शन को 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
में जोड़ने पर नाराज हो सकते हैं, यह सरणी को तर्क के रूप में लेते हुए सामान्य कार्य के रूप में काम करेगा, इसलिए इसे 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");
})();