जावास्क्रिप्ट setTimeoutऔर setInterval( अन्य ) में टाइमर फ़ंक्शन के दो (ज्यादातर उपयोग किए जाने वाले) प्रकार हैं
इन दोनों विधियों में समान हस्ताक्षर हैं। वे पैरामीटर के रूप में कॉल बैक फ़ंक्शन और विलंब समय लेते हैं।
setTimeoutदेरी के बाद केवल एक बार निष्पादित करता है जबकि setIntervalहर देरी के बाद कॉलबैक फ़ंक्शन को कॉल करता रहता है।
ये दोनों विधियाँ एक पूर्णांक पहचानकर्ता को लौटाती हैं जिनका उपयोग टाइमर के समाप्त होने से पहले उन्हें साफ़ करने के लिए किया जा सकता है।
clearTimeoutऔर clearIntervalये दोनों विधियाँ उपरोक्त कार्यों से लौटे एक पूर्णांक पहचानकर्ता को ले जाती हैं setTimeoutऔरsetInterval
उदाहरण:
setTimeout
alert("before setTimeout");
setTimeout(function(){
alert("I am setTimeout");
},1000); //delay is in milliseconds
alert("after setTimeout");
यदि आप उपरोक्त कोड चलाते हैं, तो आप देखेंगे कि यह अलर्ट करता है before setTimeoutऔर फिर after setTimeoutअंत में I am setTimeout1sec (1000ms) के बाद अलर्ट करता है
उदाहरण से आप जो नोटिस कर सकते हैं वह यह है कि setTimeout(...)यह अतुल्यकालिक है जिसका अर्थ है कि यह टाइमर के लिए इंतजार नहीं करता है ताकि अगले बयान पर जाने से पहले यानी समाप्त हो जाएalert("after setTimeout");
उदाहरण:
setInterval
alert("before setInterval"); //called first
var tid = setInterval(function(){
//called 5 times each time after one second
//before getting cleared by below timeout.
alert("I am setInterval");
},1000); //delay is in milliseconds
alert("after setInterval"); //called second
setTimeout(function(){
clearInterval(tid); //clear above interval after 5 seconds
},5000);
यदि आप उपरोक्त कोड चलाते हैं, तो आप देखेंगे कि यह अलर्ट करता है before setIntervalऔर फिर 1sec (1000ms) के बाद 5 बार after setIntervalअलर्ट करता है, I am setIntervalक्योंकि सेटटाइमआउट 5 सेकंड के बाद टाइमर को साफ़ करता है या फिर हर 1 सेकंड में आपको I am setIntervalInfinitely अलर्ट मिलेगा ।
ब्राउज़र आंतरिक रूप से कैसे करता है?
मैं संक्षेप में समझाऊंगा।
यह समझने के लिए कि आपको जावास्क्रिप्ट में ईवेंट कतार के बारे में जानना है। ब्राउज़र में एक ईवेंट कतार लागू की गई है। जब भी किसी घटना को js में ट्रिगर किया जाता है, तो इन सभी घटनाओं (जैसे क्लिक आदि ..) को इस कतार में जोड़ दिया जाता है। जब आपके ब्राउज़र को निष्पादित करने के लिए कुछ भी नहीं है, तो यह कतार से एक घटना लेता है और उन्हें एक-एक करके निष्पादित करता है।
अब, जब आप कॉल करते हैं setTimeoutया setIntervalआपका कॉलबैक ब्राउज़र में एक टाइमर के लिए पंजीकृत हो जाता है और यह दिए गए समय समाप्त होने के बाद घटना कतार में जुड़ जाता है और अंततः जावास्क्रिप्ट कतार से घटना लेता है और इसे निष्पादित करता है।
ऐसा इसलिए होता है, क्योंकि जावास्क्रिप्ट इंजन सिंगल थ्रेडेड होते हैं और वे एक बार में केवल एक ही चीज को निष्पादित कर सकते हैं। इसलिए, वे अन्य जावास्क्रिप्ट को निष्पादित नहीं कर सकते हैं और आपके टाइमर का ट्रैक रख सकते हैं। यही कारण है कि ये टाइमर ब्राउज़र के साथ पंजीकृत हैं (ब्राउज़र एकल थ्रेडेड नहीं हैं) और यह टाइमर का ट्रैक रख सकता है और टाइमर समाप्त होने के बाद कतार में एक घटना जोड़ सकता है।
setIntervalकेवल इस मामले में ऐसा होता है कि घटना को कतार में बार-बार जोड़ा जाता है और निर्दिष्ट अंतराल के बाद जब तक कि यह साफ़ नहीं हो जाता है या ब्राउज़र ताज़ा नहीं हो जाता है।
ध्यान दें
इन कार्यों के लिए आप जो विलंब पैरामीटर पास करते हैं, वह कॉलबैक निष्पादित करने के लिए न्यूनतम विलंब समय है। ऐसा इसलिए है क्योंकि टाइमर के समाप्त होने के बाद ब्राउज़र जावास्क्रिप्ट इंजन द्वारा निष्पादित की जाने वाली कतार में ईवेंट जोड़ता है, लेकिन कॉलबैक का निष्पादन कतार में आपकी घटनाओं की स्थिति पर निर्भर करता है और जैसे ही इंजन सिंगल थ्रेडेड होता है, यह सभी घटनाओं को निष्पादित करेगा एक के बाद एक कतार।
इसलिए, आपका कॉलबैक निर्दिष्ट समय से अधिक समय ले सकता है जिसे विशेष रूप से कहा जाता है, जब आपका अन्य कोड थ्रेड को ब्लॉक करता है और कतार में क्या है, इसे प्रोसेस करने का समय नहीं देता है।
और जैसा कि मैंने बताया कि जावास्क्रिप्ट एकल धागा है। इसलिए, यदि आप लंबे समय तक थ्रेड को ब्लॉक करते हैं।
इस कोड की तरह
while(true) { //infinite loop
}
आपके उपयोगकर्ता को एक संदेश मिल सकता है जिसमें कहा जा सकता है कि पेज जवाब नहीं दे रहा है ।
setTimeout(function(){/*YourCode*/},1000);