मेरे पास प्रत्येक लूप के लिए कुछ नेस्टेड नोड.जेएस हैं जो एपीआई दर सीमाओं को मार रहे हैं और मैं उन्हें धीमा करना चाहता हूं ताकि वे दर सीमा को मार न सकें। मैंने लूप के अंत में एक setTimeout जोड़ने का प्रयास किया है लेकिन अनुरोधों की गति पर इसका कोई प्रभाव नहीं पड़ता है। आदर्श रूप से, मैं हर 2 सेकंड में एक अनुरोध भेज पाऊंगा। इसे कैसे प्राप्त किया जा सकता है? ऐसा लगता है कि ऑनलाइन सब कुछ एक एपीआई को सीमित करने के बारे में बात करता है लेकिन चीजों के भेजने के पक्ष में कुछ भी नहीं है।

1
joshk132 26 जिंदा 2022, 19:23
कृपया कुछ कोड दिखाएं जहां आप लूप के साथ एपीआई को कॉल कर रहे हैं
 – 
Jamiec
26 जिंदा 2022, 19:27
इस प्रश्न को आपके प्रश्न का उत्तर देना चाहिए: stackoverflow.com/questions/ 37977602/…
 – 
Sorin
26 जिंदा 2022, 19:34
मुझे नहीं लगता कि प्रत्येक लूप जैसा दिखता है उससे जोड़ने से पहले बहुत मदद मिलेगी। यह प्रत्येक लूप के लिए दर-सीमित करने के बारे में एक सामान्य प्रश्न है, न कि मेरे एपीआई की सटीक दर सीमा। मेरे पास मेरे ऐप में अन्य स्थान हैं कि मैं प्रत्येक लूप को भी सीमित करना चाहता हूं, इसलिए एक विशिष्ट समाधान में कोई बिंदु नहीं है जब मुझे एकाधिक उपयोग मामलों के लिए सामान्य की आवश्यकता होती है
 – 
joshk132
26 जिंदा 2022, 19:35

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);
   }
}
0
Wyck 26 जिंदा 2022, 19:59
यदि आप विशेष रूप से forEach के साथ मार्गदर्शन चाहते हैं, तो कृपया यह प्रश्न देखें।
 – 
Wyck
26 जिंदा 2022, 20:04

आप 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");
})();
-1
Jamiec 26 जिंदा 2022, 19:51
डाउनवॉटर टिप्पणी करना चाहते हैं?
 – 
Jamiec
26 जिंदा 2022, 19:48