जावास्क्रिप्ट लूप के अंदर टाइमआउट / स्लीप फ़ंक्शन जोड़ें

Nov 24 2020

मैं एक js फ़ाइल के अंदर एक नींद / विलंब फ़ंक्शन जोड़ने की कोशिश कर रहा हूं, यह एक:

var webTest = function()
{

let regex = /^https?:\/\//;
let url = $('#list_urls').val().split('\n');
var xmlhttp = [], i;
var myObj2 = [], i;
 for(let i = 0; i < url.length; i++)
    {
    (function(i) {
    xmlhttp[i] = new XMLHttpRequest();
    url[i] = url[i].replace(regex, '');
    xmlhttp[i].open("GET", "https://website.com/API?key=<MY_API_KEY>&url="+url[i], false);
    xmlhttp[i].onreadystatechange = function() {
      if (xmlhttp[i].readyState === 4 && xmlhttp[i].status === 200) {
        myObj2 = JSON.parse(xmlhttp[i].responseText);
        document.getElementById("demo"+i).innerHTML = myObj2.results[1].categories;
      }
    };
xmlhttp[i].send();
})(i);
console.log(`The Server2: `+ myObj2);
 }
}

मैं इस स्क्रिप्ट फिर से 10 सेकंड के लिए रुकें और फिर काम करना और फिर करना चाहते हैं फिर से 10 सेकंड के लिए रोक सकते हैं और इस तक पाठ की लंबाई पसंद है thatn अधिक है मैं पाश में! मेरा कोड काम करता है अगर मैं एक समय के लिए चलता हूं, लेकिन यह काम नहीं करता है यदि मैं लूप में चलता हूं क्योंकि वेबसाइट की एपी में दर सीमा है, इसलिए मैं नींद समारोह जोड़ने की कोशिश कर रहा हूं।

तो क्या मैंने कोशिश की नींद का इंतजार है (); विधि और भी setTimeout विधि की कोशिश की, लेकिन यह मेरे कोड के साथ काम नहीं करता है कि तरह में उम्मीद के मुताबिक काम नहीं कर रहा है!

नींद का इंतजार (); बस सभी पर काम नहीं करता है और बिना दिखाए SyntaxError जैसे संदेश प्रदर्शित करता है: इंतजार केवल async कार्यों में मान्य है और async जनरेटर webTestfile.js: 27

जवाब

2 OskarGrosser Nov 25 2020 at 00:10

आप ES6 की async/awaitसुविधा का उपयोग कर सकते हैं !

उपयोग करने के लिए await, यह घोषित किए गए फ़ंक्शन / अभिव्यक्ति बॉडी में होना चाहिए async

मूल रूप से, यह आपके फ़ंक्शन को अतुल्यकालिक बना देगा, और इसे Promiseपूरा होने की प्रतीक्षा करेगा । हम वादा करते हैं कि एक सेट देरी के बाद वादा पूरा किया जाएगा setTimeout()
ध्यान दें कि "एक सेट देरी के बाद" का अर्थ "वास्तव में" नहीं है, इसका मूल रूप से "बाद में जितना जल्दी हो सके" का अर्थ है।

ऐसा करने से, अतुल्यकालिक कार्य पूरा होने के वादे की प्रतीक्षा करता है, इस बीच कॉलस्टैक को मुक्त करता है ताकि अन्य कोड निष्पादित हो सके।

इस उदाहरण के निष्पादन का क्रम निम्नानुसार है (सरलीकृत):

  1. sleepingFunc() कॉलस्टैक पर रखा गया है
    • पुनरावृत्ति में: awaitवादा पूरा होने के लिए, इस कॉल को स्थगित करना, कॉलस्टैक को मुक्त करना
  2. कॉलस्टैक पर नए कॉल रखें
  3. आखिरकार, वादा पूरा हो गया, awaitकॉलस्टैक पर call जगह निलंबित कॉल बैक समाप्त हो गया
  4. sleepingFunc()समाप्त होने तक दोहराएं

जैसा कि आप चरण 3 में देख सकते हैं, अगर अन्य कॉल में देरी से अधिक समय लगता है, तो निलंबित कॉल को उस अतिरिक्त समय का इंतजार करना होगा।

function sleep(ms) {
  return new Promise(resolveFunc => setTimeout(resolveFunc, ms));
}

async function sleepingFunc() {
  for (let i = 0; i < 5; ++i) {
    console.log(i + " - from sleep");
    await sleep(1000);
  }
}

function synchronousFunc() {
  for (let i = 0; i < 5; ++i) {
    console.log(i + " - from sync");
  }
}

sleepingFunc();
synchronousFunc();

2 Jkarttunen Nov 24 2020 at 22:48

यह स्निपेट हर 1 सेकंड में एक कार्य चलाता है जब तक कि स्थिति संतुष्ट नहीं होती है, और फिर टाइमर को साफ करता है।

const work = (i)=>{
 console.log('doing work here ', i);
}

let counter = 0
const timer = setInterval(()=>{
  if (timer && ++counter >= 10) {
   clearInterval(timer)
  }
  work(counter);
}, 1000)