setTimeout या setInterval?


763

जहाँ तक मैं बता सकता हूँ, जावास्क्रिप्ट के ये दो टुकड़े एक ही तरह से व्यवहार करते हैं:

विकल्प A:

function myTimeoutFunction()
{
    doStuff();
    setTimeout(myTimeoutFunction, 1000);
}

myTimeoutFunction();

विकल्प बी:

function myTimeoutFunction()
{
    doStuff();
}

myTimeoutFunction();
setInterval(myTimeoutFunction, 1000);

क्या setTimeout और setInterval का उपयोग करने के बीच कोई अंतर है ?


6
यदि आप जेएस के काम करने के समय में कुछ अच्छे विवरण चाहते हैं, तो जॉन रेसिग ने इस विषय पर एक अच्छा लेख लिखा
राफेल

9
वहाँ भी स्पष्ट अंतर है कि सेटटाइमआउट को प्रचारित रखने के लिए कोड की अतिरिक्त लाइन की आवश्यकता होती है, जिसमें रखरखाव समस्या होने का दोष है लेकिन आपको आसानी से अवधि बदलने का लाभ
annakata


4
धन्यवाद @ जपनप्रो, लेकिन मुझे वास्तव में कभी भी काम करने में समस्या नहीं हुई। यह पोस्ट इस बारे में थी कि क्या अंतर था और जिसका उपयोग किया जाना चाहिए।
दामोविसा

जवाबों:


670

वे अनिवार्य रूप से एक ही काम करने की कोशिश करते हैं, लेकिन setIntervalदृष्टिकोण दृष्टिकोण की तुलना में अधिक सटीक होगा setTimeout, चूंकि setTimeout1000ms प्रतीक्षा करता है, फ़ंक्शन चलाता है और फिर एक और टाइमआउट सेट करता है। तो प्रतीक्षा अवधि वास्तव में 1000ms से थोड़ा अधिक है (या यदि आपके कार्य को निष्पादित करने में लंबा समय लगता है)।

यद्यपि कोई सोच सकता है कि हर 1000ms पर सटीक रूपsetInterval से अमल होगा , यह ध्यान रखना महत्वपूर्ण है कि देरी भी होगी, क्योंकि जावास्क्रिप्ट एक बहु-थ्रेडेड भाषा नहीं है, जिसका अर्थ है कि - यदि स्क्रिप्ट के अन्य भाग चल रहे हैं - अंतराल होगा खत्म होने के लिए इंतजार करना होगा।setInterval

में इस फिडल , आप स्पष्ट रूप से देख सकते हैं कि समय समाप्ति के पीछे गिर जाएगी, जबकि अंतराल लगभग 1 कॉल / सेकंड (जो स्क्रिप्ट करने के लिए कोशिश कर रहा है) पर लगभग हर समय है। यदि आप शीर्ष चर को 20 की तरह कुछ छोटा करते हैं (मतलब यह प्रति सेकंड 50 बार चलाने की कोशिश करेगा), अंतराल कभी भी प्रति सेकंड 50 पुनरावृत्तियों की औसत तक नहीं पहुंचेगा।

देरी लगभग हमेशा नगण्य है, लेकिन अगर आप वास्तव में सटीक कुछ प्रोग्रामिंग कर रहे हैं, तो आपको एक स्व-समायोजन टाइमर के लिए जाना चाहिए (जो अनिवार्य रूप से एक टाइमआउट-आधारित टाइमर है जो लगातार अपने द्वारा बनाए गए विलंब के लिए खुद को समायोजित करता है)


4
एंडी का भी ऐसा ही सुझाव था। हाइपोथेटिक रूप से, इसका मतलब यह है कि यदि विधि निष्पादित करने के लिए 1000ms से अधिक समय लेती है, तो आपके पास एक से अधिक रन हो सकते हैं?
दामोविसा

14
सैद्धांतिक रूप से, हाँ। व्यवहार में, कोई भी जावास्क्रिप्ट मल्टीथ्रेडिंग का समर्थन नहीं करता है। यदि आपका कोड 1000ms से अधिक समय लेता है, तो यह ब्राउज़र को फ्रीज कर देगा।
कामिल वानरोइज

61
तकनीकी रूप से, कोड न केवल प्रत्येक 1000ms पर लागू होता है, क्योंकि यह टाइमर के संकल्प पर निर्भर करता है और क्या अन्य कोड पहले से ही निष्पादित हो रहा है। आपकी बात अब भी कायम है।
मैथ्यू क्रुमले

10
setInterval दो तरह से अलग होता है, १। setInterval पुनरावर्ती नहीं है और setInterval आपके कार्य को पहली बार बताए गए समय के बाद कॉल करेगा, जबकि setTimeout पहली बार बिना किसी देरी के कॉल किया जा रहा है और उसके बाद यह बताए गए समय के बाद फिर से कॉल करेगा। पहले निष्पादन के बाद वे लगभग एक ही काम करते हैं।
हाफिज

5
अंतर यह है कि सेटटाइमआउट स्वयं को दोहराता नहीं है। यह आपको एक निर्धारित समय के बाद स्क्रिप्ट चलाने की अनुमति देता है, लेकिन केवल एक बार। दूसरी ओर setInterval उस स्क्रिप्ट को दोहराएगा, जब तक कि उसे क्लियरटाइम () के साथ बंद नहीं किया जाता है।
लिएंडर

648

क्या कोई अंतर है?

हाँ। एक टाइमआउट सेटटाइमआउट () कहा जाता है के बाद समय की एक निश्चित राशि को निष्पादित करता है; एक अंतराल पिछले अंतराल के निकाल दिए जाने के बाद एक निश्चित समय पर अमल करता है।

यदि आपका doStuff () फ़ंक्शन निष्पादित होने में कुछ समय लेता है, तो आपको अंतर दिखाई देगा। उदाहरण के लिए, यदि हम setTimeout / setInterval के साथ कॉल का प्रतिनिधित्व करते हैं, तो .टाइमआउट / अंतराल की एक फायरिंग *और जावास्क्रिप्ट कोड निष्पादन के साथ [-----], समयसीमा जैसी दिखती है:

Timeout:

.    *  .    *  .    *  .    *  .
     [--]    [--]    [--]    [--]

Interval:

.    *    *    *    *    *    *
     [--] [--] [--] [--] [--] [--]

अगली जटिलता यह है कि यदि जावास्क्रिप्ट अंतराल है, जबकि जावास्क्रिप्ट पहले से ही कुछ करने में व्यस्त है (जैसे कि पिछले अंतराल को संभालना)। इस मामले में, अंतराल को याद किया जाता है, और जैसे ही पिछले हैंडलर खत्म होता है और ब्राउज़र पर नियंत्रण वापस करता है। तो उदाहरण के लिए एक doStuff () प्रक्रिया के लिए जो कभी-कभी छोटी ([-]) और कभी-कभी लंबी होती है ([-----]):

.    *    *        *        *    *
     [-]  [-----][-][-----][-][-]  [-]

• एक अंतराल फायरिंग का प्रतिनिधित्व करता है जो अपने कोड को सीधे निष्पादित नहीं कर सकता था, और इसके बजाय लंबित बना दिया गया था।

तो अंतराल तय समय पर वापस पाने के लिए 'पकड़ने' की कोशिश करते हैं। लेकिन, वे एक दूसरे के शीर्ष पर कतार नहीं लगाते हैं: केवल एक ही अंतराल के प्रति लंबित निष्पादन हो सकता है। (यदि वे सभी कतारबद्ध हो जाते हैं, तो ब्राउज़र को उत्कृष्ट निष्पादन की एक विस्तृत सूची के साथ छोड़ दिया जाएगा!)

.    *            x            x
     [------][------][------][------]

x एक अंतराल फायरिंग का प्रतिनिधित्व करता है जो निष्पादित या लंबित नहीं किया जा सकता है, इसलिए इसके बजाय छोड़ दिया गया था।

यदि आपका doStuff () फ़ंक्शन आदतन उस अंतराल से निष्पादित होने में अधिक समय लेता है जो इसके लिए निर्धारित है, तो ब्राउज़र इसे सेवा करने की कोशिश में 100% सीपीयू खाएगा, और कम संवेदनशील हो सकता है।

आप किसका उपयोग करते हैं और क्यों?

जंजीर-टाइमआउट ब्राउज़र को खाली समय की गारंटी स्लॉट देता है; इंटरवल यह सुनिश्चित करने की कोशिश करता है कि यह ब्राउज़र यूआई उपलब्धता की कीमत पर, अपने निर्धारित समय के अनुसार जितना संभव हो उतना निष्पादित हो।

मैं एक बार के एनिमेशन के लिए एक अंतराल पर विचार करना चाहता था जो मैं जितना संभव हो उतना चिकनी होना चाहता था, जबकि जंजीर टाइमआउट चल रहे एनिमेशन के लिए अधिक विनम्र होते हैं जो पृष्ठ लोड होने तक हर समय जगह लेते हैं। कम मांग वाले उपयोगों के लिए (जैसे कि हर 30 सेकंड या किसी अन्य चीज पर तुच्छ अपडाउन करने वाला), आप या तो सुरक्षित रूप से उपयोग कर सकते हैं।

ब्राउज़र संगतता के संदर्भ में, सेटटाइमआउट सेटइंटरवल से पूर्ववर्ती है, लेकिन आज मिलने वाले सभी ब्राउज़र दोनों का समर्थन करेंगे। कई वर्षों के लिए अंतिम स्ट्रगलर WinMo <6.5 में IE मोबाइल था, लेकिन उम्मीद है कि वह भी अब हमारे पीछे है।


लेकिन क्या इंटरवल और टाइमआउट के बीच चयन का कारण गैर-ब्राउज़र प्लेटफ़ॉर्म भी सही है, जैसे उदाहरण WebOS या JIL?
विद एल

2
अनाम फ़ंक्शंस पर जंजीर टाइमआउट करने का एक अच्छा तरीका: setTimeout (फ़ंक्शन () {setTimeout (बहस ..callee, 10)}, 10)
जस्टिन मेयर

1
ब्राउज़र संगतता के संदर्भ में, हालांकि सभी ब्राउज़र दोनों तरीके प्रदान करते हैं, उनका प्रदर्शन अलग है।
13

"लेकिन फिर संभावना है कि यह किसी और चीज का समर्थन नहीं करता है जो आप या तो उपयोग कर रहे हैं" बहुत ही सच है
बेसिक

1
सेट टाइमआउट ("शेड्यूल ()", 0) का उपयोग करके क्रोमियम प्रोजेक्ट द्वारा ड्रम मशीन ; जब क्रोम या संसाधनों की कमी की पृष्ठभूमि टैब है तो ब्राउज़र में अनावश्यक स्टैक नहीं होगा।
इलियट याप

90

setInterval ()

setInterval()एक समय अंतराल आधारित कोड निष्पादन विधि है जो अंतराल तक पहुंचने पर एक निर्दिष्ट स्क्रिप्ट को बार-बार चलाने की मूल क्षमता है। इसे स्क्रिप्ट लेखक द्वारा अपने कॉलबैक फ़ंक्शन में नेस्ट नहीं किया जाना चाहिए , क्योंकि यह डिफ़ॉल्ट रूप से लूप करता है । जब तक आप फोन नहीं करेंगे, यह अंतराल पर फायरिंग करता रहेगा clearInterval()

यदि आप एनिमेशन के लिए या घड़ी की टिक पर लूप कोड चाहते हैं, तो उपयोग करें setInterval()

function doStuff() {
    alert("run your code here when time interval is reached");
}
var myTimer = setInterval(doStuff, 5000);

setTimeout ()

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

function doStuff() {
    alert("run your code here when time interval is reached");
}
var myTimer = setTimeout(doStuff, 5000);

यदि आप चाहते हैं कि एक निर्दिष्ट अवधि के बाद एक बार कुछ हो, तो उपयोग करें setTimeout()। ऐसा इसलिए है क्योंकि यह केवल एक समय निष्पादित करता है जब निर्दिष्ट अंतराल तक पहुंच जाता है।


6
अच्छी व्याख्या लेकिन ध्यान दें कि ओपी प्रदान किए गए उदाहरणों में मूल अंतर को समझता है। विशेष रूप से, ध्यान दें कि ओपी के setTimeout()उदाहरण में, पुनरावर्तीsetTimeout() कहा जाता है , जबकि ऐसा नहीं है। setInterval()
डेविड आरआर

44

सेटइंटरवाल आपके कोड के भविष्य के निष्पादन को रद्द करना आसान बनाता है। यदि आप सेटटाइमआउट का उपयोग करते हैं, तो आपको टाइमर आईडी का ट्रैक रखना होगा यदि आप इसे बाद में रद्द करना चाहते हैं।

var timerId = null;
function myTimeoutFunction()
{
    doStuff();
    timerId = setTimeout(myTimeoutFunction, 1000);
}

myTimeoutFunction();

// later on...
clearTimeout(timerId);

बनाम

function myTimeoutFunction()
{
    doStuff();
}

myTimeoutFunction();
var timerId = setInterval(myTimeoutFunction, 1000);

// later on...
clearInterval(timerId);

35
मैं नहीं देखता कि आप कैसे सेट के मामले में टाइमर आईडी का ध्यान नहीं रख रहे हैं। यह सिर्फ फ़ंक्शन से निकाला गया है।
काकोआ

1
इसके साथ एक और विकल्प setTimeoutआईडी सेव करने के बजाय एक ifस्टेटमेंट है कि कुछ शर्त सही होने पर ही अगली टाइमआउट सेट करें।
nnnnnn

7
कोको, अच्छा बिंदु। लेकिन आपको इंटरवल आईडी केवल एक बार बचानी है। टाइमआउट आईडी शायद हर आह्वान के साथ बदल रही है, इसलिए आपको इन परिवर्तनों पर नज़र रखनी होगी । कोड जो टाइमआउट को खाली करना चाहता है उसे किसी भी तरह से इस चर के वर्तमान मूल्य तक पहुंचना है। इसके अतिरिक्त doStuffआईडी चलाते समय टाइमआउट को खाली करना असंभव है क्योंकि आईडी अमान्य है। हालांकि, टाइमआउट आईडी को बचाने के लिए वास्तव में आवश्यक नहीं है। इसके बजाय आप कॉल करना बंद कर सकते हैं setTimeout
राबर्ट

4
मेरे अनुभव में, अधिकांश समय आप सेटटाइमआउट का उपयोग करते हुए भी रद्द करने में सक्षम होना चाहते हैं। अगले मंगलाचरण होने से पहले आप जिस समय को रद्द करना चाहते हैं, उसका 99% , अगले एक खत्म होने के बाद नहीं ।
कामिल वानरोइज

23

setTimeoutयदि आप टाइमआउट को रद्द करना चाहते हैं, तो मुझे इसका उपयोग करना आसान लगता है :

function myTimeoutFunction() {
   doStuff();
   if (stillrunning) {
      setTimeout(myTimeoutFunction, 1000);
   }
}

myTimeoutFunction();

साथ ही, यदि फ़ंक्शन में कुछ गलत हो जाएगा, तो वह हर बार त्रुटि को दोहराने के बजाय पहली बार त्रुटि को दोहराना बंद कर देगा।


20

बहुत अंतर उनके उद्देश्यों में है।

setInterval()
   -> executes a function, over and over again, at specified time intervals  

setTimeout()
   -> executes a function, once, after waiting a specified number of milliseconds

यह इतना सरल है

अधिक विस्तृत विवरण यहाँ http://javascript.info/tutorial/settimeout-setinterval


7
अच्छा संक्षिप्त विवरण लेकिन ध्यान दें कि ओपी प्रदान किए गए उदाहरणों में मूल अंतर को समझता है। विशेष रूप से, ध्यान दें कि ओपी के setTimeout()उदाहरण में, पुनरावर्तीsetTimeout() कहा जाता है , जबकि ऐसा नहीं है। setInterval()
डेविड R

14

जब आप setInterval के अंदर कुछ फ़ंक्शन चलाते हैं, जो टाइमआउट से अधिक समय तक काम करता है-> ब्राउज़र अटक जाएगा।

- जैसे, doStuff () में 1500 सेकंड लगते हैं। निष्पादित करने के लिए और आप करते हैं: setInterval (doStuff, 1000);
1) ब्राउज़र रन डस्टफ () जो 1.5 सेकंड लेता है। निष्पादित किए जाने के लिए;
2) ~ 1 सेकंड के बाद यह फिर से doStuff () चलाने की कोशिश करता है । लेकिन पिछले doStuff () अभी भी निष्पादित है- > इसलिए ब्राउज़र इस रन को कतार में जोड़ता है (पहले किए जाने के बाद चलाने के लिए)।
3,4, ..) अगले पुनरावृत्तियों के लिए निष्पादन की कतार में एक ही जोड़, लेकिन पिछले से doStuff () अभी भी प्रगति पर हैं ... परिणामस्वरूप-
ब्राउज़र अटक गया है।

इस व्यवहार को रोकने के लिए, सबसे अच्छा तरीका है सेटटाइमआउट के अंदर सेटटाइमआउट को सेट करना
सेटटाइमआउट कॉल के बीच टाइमआउट को सही करने के लिए, आप जावास्क्रिप्ट के सेटइंटरवल तकनीक के लिए स्व-सही विकल्प का उपयोग कर सकते हैं ।


1
मैं नहीं जानता कि क्यों किसी को भी इस जवाब में कोई मूल्य नहीं मिला है!
रंडिका विशमन

9

मैं सेटटाइमआउट का उपयोग करता हूं।

स्पष्ट रूप से अंतर सेटटाइमआउट है विधि को एक बार कॉल करें, सेटइंटरवल इसे दोहराता है।

अंतर बताने वाला एक अच्छा लेख यहां दिया गया है: ट्यूटोरियल: सेटटाइमआउट और सेटइंटरवल के साथ जावास्क्रिप्ट टाइमर


2
हां, मुझे यह अंतर मिला, लेकिन मैंने जो दो कोड प्रदान किए हैं, उन्हें फिर वही काम करना चाहिए ...
दामोविसा

उम्म्म्म हाँ ... मैंने सोचा होगा ... लेकिन डकंट और उसकी वोट गणना के अनुसार ऐसा नहीं होता है।
ब्रवाक्ष

9

आपके कोड में अलग-अलग निष्पादन पूर्णांक होंगे, और कुछ परियोजनाओं में, जैसे कि ऑनलाइन गेम यह स्वीकार्य नहीं है। सबसे पहले, आपको क्या करना चाहिए, अपने कोड को समान अंतराल के साथ काम करने के लिए, आपको इसे "myTimeoutFunction" में बदलना चाहिए:

function myTimeoutFunction()
{
    setTimeout(myTimeoutFunction, 1000);
    doStuff();
}
myTimeoutFunction()

इस बदलाव के बाद यह बराबर हो जाएगा

function myTimeoutFunction()
{
    doStuff();
}
myTimeoutFunction();
setInterval(myTimeoutFunction, 1000);

लेकिन, आपके पास स्थिर परिणाम नहीं होगा, क्योंकि जेएस एकल-थ्रेडेड है। अभी के लिए, यदि JS थ्रेड किसी चीज़ में व्यस्त होगा, तो यह आपके कॉलबैक फ़ंक्शन को निष्पादित करने में सक्षम नहीं होगा, और निष्पादन 2-3 मिसे के लिए स्थगित कर दिया जाएगा। क्या आपके पास प्रति सेकंड 60 निष्पादन है, और हर बार जब आपके पास यादृच्छिक 1-3 सेकंड की देरी होती है, तो यह बिल्कुल स्वीकार्य नहीं होगा (एक मिनट के बाद यह लगभग 7200 मिसे देरी होगी), और मैं इस तरह से कुछ का उपयोग करने की सलाह दे सकता हूं:

    function Timer(clb, timeout) {
        this.clb = clb;
        this.timeout = timeout;
        this.stopTimeout = null;
        this.precision = -1;
    }

    Timer.prototype.start = function() {
        var me = this;
        var now = new Date();
        if(me.precision === -1) {
            me.precision = now.getTime();
        }
        me.stopTimeout = setTimeout(function(){
            me.start()
        }, me.precision - now.getTime() + me.timeout);
        me.precision += me.timeout;
        me.clb();
    };

    Timer.prototype.stop = function() {
        clearTimeout(this.stopTimeout);
        this.precision = -1;
    };

    function myTimeoutFunction()
    {
        doStuff();
    }

    var timer = new Timer(myTimeoutFunction, 1000);
    timer.start();

यह कोड स्थिर निष्पादन अवधि की गारंटी देगा। यहां तक ​​कि थ्रेड व्यस्त हो जाएगा, और आपका कोड 1005 मिसेकंड के बाद निष्पादित किया जाएगा, अगली बार 995 मिसे के लिए समय समाप्त हो जाएगा, और परिणाम स्थिर होगा।


7

मैंने सरल परीक्षण किया है setInterval(func, milisec), क्योंकि मैं उत्सुक था कि क्या होता है जब फ़ंक्शन समय की खपत अंतराल अवधि से अधिक होती है।

setIntervalआम तौर पर अगली यात्रा की शुरुआत के बाद ही अगली पुनरावृत्ति अनुसूची होगी , जब तक कि फ़ंक्शन अभी भी जारी है । यदि ऐसा है, तो setIntervalकार्य समाप्त होने तक प्रतीक्षा करेंगे। जैसे ही ऐसा होता है, फ़ंक्शन को तुरंत फिर से निकाल दिया जाता है - अनुसूची के अनुसार अगले पुनरावृत्ति की प्रतीक्षा नहीं होती है (क्योंकि यह समय से अधिक कार्य किए बिना शर्तों के तहत होगा)। समानांतर चलने वाली पुनरावृत्तियों के साथ भी कोई स्थिति नहीं है।

मैंने इसे Chrome v23 पर परीक्षण किया है। मुझे आशा है कि यह सभी आधुनिक ब्राउज़रों में निर्धारक कार्यान्वयन है।

window.setInterval(function(start) {
    console.log('fired: ' + (new Date().getTime() - start));
    wait();
  }, 1000, new Date().getTime());

कंसोल आउटपुट:

fired: 1000    + ~2500 ajax call -.
fired: 3522    <------------------'
fired: 6032
fired: 8540
fired: 11048

waitसमारोह सिर्फ एक धागा अवरुद्ध सहायक है - तुल्यकालिक ajax कॉल जो वास्तव में लेता है 2500 मिलीसेकेंड सर्वर साइड पर प्रसंस्करण के:

function wait() {
    $.ajax({
        url: "...",
        async: false
    });
}

1
"समानांतर चलने के साथ कोई स्थिति नहीं चल रही है" - हाँ, यह असंभव होना चाहिए। क्लाइंट-साइड जावास्क्रिप्ट में एक एकल थ्रेडेड निष्पादन मॉडल होता है, इसलिए कभी भी (ईवेंट हैंडलर आदि) कुछ भी नहीं होता है। यही कारण है कि तुल्यकालिक अजाक्स कॉल के दौरान कुछ भी नहीं होता है (और ब्राउज़र अनुत्तरदायी है)।
मृद्वीत

क्या ब्राउज़र "अंतराल" के बीच कुछ एमएस में उत्तरदायी है? यदि यह लंबित है तो क्या कोई अन्य घटना होगी? (टेस्ट btw +1 के लिए धन्यवाद)
MrWhite

1
एमडीएन के अनुसार, यह " खतरनाक उपयोग " माना जाता है यदि फ़ंक्शन अंतराल समय से अधिक समय तक निष्पादित कर सकता है। एक पुनरावर्ती setTimoutकॉल को प्राथमिकता दी जाती है।
MrWhite 10

6

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

उदाहरण के लिए, टाइमर / उलटी गिनती सेटटाइमआउट के साथ नहीं की जाती है, उन्हें सेटइंटरवल के साथ किया जाता है, यह सुनिश्चित करने के लिए कि यह देरी नहीं करता है और कोड सटीक दिए गए अंतराल पर चलता है।


5

सेटटेरवल और सेटटाइमआउट दोनों एक टाइमर आईडी लौटाते हैं जिसका उपयोग आप निष्पादन को रद्द करने के लिए कर सकते हैं, अर्थात, टाइमआउट के ट्रिगर होने से पहले। रद्द करने के लिए आप या तो clearInterval या clearTimeout को इस तरह कहते हैं:

var timeoutId = setTimeout(someFunction, 1000);
clearTimeout(timeoutId);
var intervalId = setInterval(someFunction, 1000),
clearInterval(intervalId);

जब आप पृष्ठ छोड़ते हैं या ब्राउज़र विंडो बंद करते हैं, तो टाइमआउट स्वचालित रूप से रद्द हो जाते हैं।


4

जब आप निम्न जावास्क्रिप्ट चलाते हैं या इस JSFiddle की जाँच करके आप अपने आप से बॉबिन उत्तर को मान्य कर सकते हैं

<div id="timeout"></div>
<div id="interval"></div>

var timeout = 0;
var interval = 0;

function doTimeout(){
    $('#timeout').html(timeout);
    timeout++;
    setTimeout(doTimeout, 1);
}

function doInterval(){
    $('#interval').html(interval);
    interval++;
}

$(function(){
    doTimeout();
    doInterval();
    setInterval(doInterval, 1);
});

3

खैर, सेटटाइमआउट एक स्थिति में बेहतर है, जैसा कि मैंने अभी सीखा है। मैं हमेशा सेटइंटरवल का उपयोग करता हूं, जिसे मैंने आधे घंटे से अधिक समय तक पृष्ठभूमि में चलाना छोड़ दिया है। जब मैंने उस टैब पर वापस स्विच किया, तो स्लाइडशो (जिस पर कोड का उपयोग किया गया था) हर 5 सेकंड के बजाय बहुत तेज़ी से बदल रहा था, जो उसके पास होना चाहिए था। यह वास्तव में फिर से होता है जैसा कि मैंने इसे और अधिक परीक्षण किया है और क्या यह ब्राउज़र की गलती है या महत्वपूर्ण नहीं है, क्योंकि सेटटाइमआउट के साथ वह स्थिति पूरी तरह से असंभव है।


लगता है जैसे आपने उस फ़ंक्शन के अंदर setInterval को कॉल किया था जिसे आप कॉल कर रहे थे। यह है कि आप सेटटाइमआउट के साथ कैसे लूप करते हैं, लेकिन सेटइंटरवल के साथ आप वास्तव में हर बार पूरी तरह से नया लूप बना रहे हैं जिसे यह कहा जाता है।
स्टीफन आर


2

बस पहले से ही कहा गया है पर जोड़ने पर कोड का सेट टाइमआउट संस्करण भी पहुंच जाएगा Maximum call stack sizeजो इसे कार्य करने से रोक देगा। चूंकि पुनरावर्ती कार्य को रोकने के लिए कोई आधार मामला नहीं है, इसलिए आप इसे हमेशा के लिए नहीं चला सकते।


मुझे नहीं लगता कि यह सच है। यहाँ देखें stackoverflow.com/questions/8058612/…
केविन व्हीलर

-1

और सेटइंटरवल (अभिव्यक्ति, अवधि) के बीच सबसे सामान्य अंतर यह है कि

setTimeout () केवल निर्दिष्ट अवधि के बाद ONCE की अभिव्यक्ति को अंजाम देगा।

तथापि,

setInterval () प्रत्येक निर्दिष्ट अवधि के बाद INFINITE-LOOP में अभिव्यक्ति को निष्पादित करेगा।


-5

मुझे लगता है SetIntervalऔर SetTimeoutअलग हैं। SetIntervalसमय के अनुसार ब्लॉक को SetTimeoutनिष्पादित करता है , जबकि कोड के ब्लॉक को एक बार निष्पादित करता है।

टाइमआउट उलटी गिनती सेकंड के बाद कोड के इन सेट को आज़माएं:

setInterval(function(e){
    alert('Ugbana Kelvin');
}, 2000);

और फिर प्रयास करें

setTimeout(function(e){
    alert('Ugbana Kelvin');
}, 2000);

आप अपने लिए अंतर देख सकते हैं।


इस सवाल का जवाब नहीं है। setimeout () का उपयोग पुनर्संरचना में सेटर्निवल के समान परिणाम देने के लिए किया जा सकता है। सवाल इन दो विकल्पों के प्रदर्शन के बारे में था।
टॉमस गोंजालेज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.