2011-06-22 21 views
12

मेरे पास एक ऐसा फ़ंक्शन है जो टाइमर सेट करता है, और टाइमर की समाप्ति पर स्वयं को वापस कॉल करता है।जावास्क्रिप्ट: क्या सेटटाइमआउट से पहले क्लीयरटाइम कॉल करना ठीक है?

मैं क्या जानना चाहता हूं कि यह कार्य के शीर्ष पर टाइमर को साफ़ करने का बुरा अभ्यास है।

इसका कारण यह है कि मैं समय-समय पर उस कार्य को अतुल्यकालिक रूप से कॉल कर दूंगा, और यदि मैं पहले टाइमर को साफ़ नहीं करता हूं, तो मेरे पास दो साथ चलेंगे।

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

एक अन्य विचार - क्या मैं क्लीयरटाइम कॉल करने से पहले टाइमर चर का परीक्षण कर सकता हूं, यह देखने के लिए कि यह टाइमर है या नहीं?

function onAir(){ 

    // reset timer 
    clearTimeout(timer); 

    $.getJSON("http://mywebsite.com?format=json&callback=?",function(data){ 
     if(data.result == '1'){ 
      do stuff here 
     } 
     else{ 
      do other stuff here 
     } 
    }); 

    // start timer 
    timer = setTimeout("onAir()",60000); 
} 

मेरे साथ अपने मस्तिष्क को साझा करने के लिए धन्यवाद:

यहाँ कुछ उदाहरण कोड है!

केनी

+0

त्वरित उत्तरों के लिए सभी को धन्यवाद! साथ ही, यह सुधारने के लिए धन्यवाद कि मैं फ़ंक्शन को वापस कैसे कॉल कर रहा हूं। वहां कुछ नया सीख लिया! – Kenny

उत्तर

14

हाँ, यह ठीक है। इसके अलावा, आप "() setTimeout" इस तरह बुलाना चाहिए:

timer = setTimeout(onAir, 60000); 
+0

मैं 47 सेकंड बहुत देर हो चुकी थी .... – Neal

+6

c'est la vie ici :-) – Pointy

+2

आलसी लोगों के लिए: "c'est la vie ici" का अर्थ है "यह जीवन है"। –

4

हाँ, आप एक अशक्त चर पर एक clearTimeout कॉल कर सकते हैं और दुनिया फटना नहीं होंगे।

15

हाँ आप एक null चर पर clearTimeout कॉल कर सकते हैं।

इसके अलावा मैं आप बदलना आपके setTimeout तो यह eval का उपयोग नहीं होगा सुझाव है:

timer = setTimeout(onAir,60000); 
+0

अभिभावक जोड़कर एआईआर फ़ंक्शन निष्पादित करेंगे।बस संदर्भ पारित करना पर्याप्त होना चाहिए। – thescientist

+0

@thescientist - धन्यवाद मैं बंद उदाहरण के लिए '()' – Neal

0

एक समय समाप्ति समाशोधन मेरे लिए समस्या नहीं उठाती है (लेकिन मैं एक जावास्क्रिप्ट गुरु नहीं कर रहा हूँ)।

Btw, तो आप इस धागे पर intersting बातें (एक मौजूदा समय समाप्त जाँच) पा सकते हैं: Check if a timeout has been cleared?

5

हाँ आप clearTimeout(timer) कॉल कर सकते हैं, लेकिन वहाँ कुछ बढ़त मामलों में जहां यह समस्याएँ उत्पन्न कर सकते हैं।

यदि timer पहले किसी अन्य पूर्णांक मान के साथ सेट किया गया था, तो आप एक पूरी तरह से असंबंधित टाइमर को मार सकते हैं।

setTimeout बस टाइमर के लिए एक पूर्णांक अनुक्रमणिका देता है। आप यकीन है कि अगर एक टाइमर पहले से स्थापित किया गया है नहीं कर रहे हैं, तो आप clearTimeout कॉल करने से पहले एक चेक जोड़ सकते हैं:

(function(){ 
    var timer, 
    duration; 
    duration = 60000; 
    window.onAir = function onAir(){ 
    ...code... 
    if (timer){ 
     clearTimeout(timer); 
    } 
    timer = setTimeout(onAir,duration); 
    }; 
}); 
:

if (window.timer) 
{ 
    clearTimeout(timer); 
} 
... 
timer = setTimeout(onAir, duration); 

टाइमर चर के संभावित प्रदूषण के लिए एक समाधान को बंद करने का उपयोग करने के लिए है

+0

+1 को हटाने और किनारे के मामलों का उल्लेख करने के लिए भूल गया, बहुत महत्वपूर्ण आईएमओ – spirytus

संबंधित मुद्दे