2010-10-02 22 views
42

मैं AJAX और asp.net का उपयोग कर रहा हूं। iI में एक जावास्क्रिप्ट फ़ंक्शन है जो सेटटाइमआउट के साथ कई अन्य जावास्क्रिप्ट फ़ंक्शन बनाता है। एसिंक्रोनस पोस्टबैक होने के बाद, मैं इन सभी सेटटाइमेटेड घटनाओं को अक्षम करना चाहता हूं। मैं उसे कैसे कर सकता हूँ?मैं सभी सेटटाइमआउट ईवेंट को कैसे अक्षम कर सकता हूं?

उत्तर

89

जब आप setTimeout() पर कॉल करते हैं, तो टाइमर आईडी स्टोर करें ताकि आप इसे साफ़ कर सकें। यदि आप कई टाइमआउट बना रहे हैं, तो आईडी को संग्रहीत करने के लिए एक सरणी एक अच्छा विकल्प है।

var timeouts = []; 
//then, store when you create them 
timeouts.push(setTimeout({ ... }, 1000)); 

तब जब आप उन्हें साफ़ करना चाहते हैं:

for (var i = 0; i < timeouts.length; i++) { 
    clearTimeout(timeouts[i]); 
} 
//quick reset of the timer array you just cleared 
timeouts = []; 

@Robert के रूप में नीचे वर्णित है, clearTimeout() एक त्रुटि है, तो पहले से ही समय समाप्त हो गई है फेंक नहीं होगा, इसलिए वहाँ कोई दौड़ कर रहे हैं/उदाहरण के लिए समय मुद्दों पर।

+3

इसके अलावा ध्यान देने योग्य चर तय, 'clearTimeout()' एक अपवाद के माध्यम से गलत आईडी पारित नहीं होगा, अगर है (यदि टाइमआउट पहले से ही हुई) । – Robert

+0

@Robert - अच्छा बिंदु, मैं इसे मंजूरी के लिए लेता हूं लेकिन अगर इसमें कोई चिंता हो तो मैं इसे जोड़ दूंगा :) –

+0

मुझे लगता है कि जावास्क्रिप्ट एकल-थ्रेडेड मॉडल के साथ: सभी मामलों में , एक बार स्पष्ट टाइमआउट पूरा हो गया है, यह गारंटी है कि टाइमआउट घटना फिर से नहीं होगी। यह दस्तावेज़ों में नहीं है, क्या यह बिना कहने के जाता है? – jcalfee314

4

सुनिश्चित नहीं है कि आप इसे वैश्विक रूप से कर सकते हैं, लेकिन सबसे आम तरीका clearTimeout का उपयोग करना है। आप setTimeout() को ClearTimeout() को रिटर्न मान पास करते हैं, आप सभी टाइमआउट वर्र्स को स्टोर करने के लिए वैश्विक var का उपयोग कर सकते हैं।

92

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

यह एक हैक है, सावधानी के साथ उपयोग करें!

// Set a fake timeout to get the highest timeout id 
var highestTimeoutId = setTimeout(";"); 
for (var i = 0 ; i < highestTimeoutId ; i++) { 
    clearTimeout(i); 
} 

मूल रूप से यह उच्चतम टाइमर आईडी पकड़ लेता है और सब कुछ है कि कम से कम साफ करता है। लेकिन अन्य टाइमर को साफ़ करना भी संभव है जिन्हें आप साफ़ नहीं करना चाहते हैं!

+0

वैडोटास के लिए धन्यवाद, मैंने अपने सेट टाइमआउट फ़ंक्शन को और अधिक ब्राउज़र अनुकूल बनाने के लिए अपडेट किया – SeanDowney

+12

+1 यह सभी समय-समय पर बंद करने के लिए जावास्क्रिप्ट कंसोल में पेस्ट करने के लिए एक बहुत ही आसान स्निपेट है! –

+2

यह हैक हार्ड-टू-कैच बग का कारण बनता है क्योंकि यदि कोई तृतीय पक्ष लाइब्रेरी प्रारंभ करने के लिए setTimout और setInterval का उपयोग करती है, तो libary किसी भी कारण से काम करना बंद कर देगा जैसा कि मैंने अभी पाया था। – user2191332

3

सबसे पहले, मैं इस कोड का उपयोग किया गया था:

var x = setTimeout(''); 
for (var i = 0; i < x; i++) 
    clearTimeout(x); 

हालांकि, कोड के इस शांति गूगल क्रोम पर काम नहीं किया। तो मैं इस के लिए सुधार किया:

var x = setTimeout('alert("x");',100000); //It is very low probability that after 100 seconds x timeout will not be cleared 
for (var i = 0; i <= x; i++) 
    clearTimeout(i); 

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

संपादित करें: गलत पाश में इस्तेमाल किया (उपयोग मैं एक्स के बजाय)

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