2011-03-07 17 views
30

मैं सोच रहा हूँ वहाँ अगर एक टाइमआउट अब भी है बताने के लिए एक तरह सेजांचें कि क्या एक टाइमआउट साफ़ कर दिया गया है?

var t=setTimeout("alertMsg()",3000); 

सेट मैंने सोचा था कि टी यदि आप खुले यह अनिर्धारित की तरह होगा। लेकिन ऐसा लगता है कि कुछ आईडी है जो साफ़ नहीं होती है।

+0

भी देखें http://stackoverflow.com/questions/4021374/how-to-know-if-a-timer-is-cleared-or-timed -आउट-इन-जावास्क्रिप्ट – goodeye

उत्तर

31

सीधे नहीं, लेकिन आप उस कार्यक्षमता को देने के लिए एक रैपर ऑब्जेक्ट बना सकते हैं।

function Timeout(fn, interval) { 
    var id = setTimeout(fn, interval); 
    this.cleared = false; 
    this.clear = function() { 
     this.cleared = true; 
     clearTimeout(id); 
    }; 
} 

तो फिर तुम जैसे कुछ कर सकते हैं:: एक किसी न किसी तरह कार्यान्वयन इसलिए की तरह है

var t = new Timeout(function() { 
    alert('this is a test'); 
}, 5000); 
console.log(t.cleared); // false 
t.clear(); 
console.log(t.cleared); // true 

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

उम्मीद है कि इससे मदद मिलती है।

+0

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

+0

@ निगेलपैक: यह आसान है, लेकिन लगभग हर तरह से एक रैपर ऑब्जेक्ट एक डिजाइन परिप्रेक्ष्य से काफी बेहतर है: encapsulation, चिंताओं को अलग करना, DRY ... – Reid

+0

यह पूरी प्रतिभा है! –

4

नहीं। पता करने के लिए, clearTimeout पर कॉल करने के बाद आपको t वैरिएबल को खाली करने की आवश्यकता होगी। अन्यथा वास्तव में कोई संकेतक नहीं है।

और एफवाईआई, एक स्ट्रिंग के बजाय फ़ंक्शन के प्रत्यक्ष संदर्भ को पार करना बेहतर है जो eval'd होगा।

var t=setTimeout(alertMsg,3000); 
20

सबसे पहले, मैं इस जवाब के हिस्सों के लिए रीड को क्रेडिट दे रहा हूं, हालांकि मुझे लगा कि मुझे कुछ सुझाव जोड़ना चाहिए। रीड के कोड के लिए मेरे मामूली वृद्धि के साथ, इस होगा:

  • ऑटो स्पष्ट जब टाइमआउट स्वाभाविक रूप से समाप्त हो रहा है
  • वैकल्पिक रूप से समय समाप्ति समारोह (बजाय सिर्फ वैश्विक क्षेत्र में क्रियान्वित करने) के दायरे से निर्धारित किया है।
  • वैकल्पिक रूप से समय समाप्ति समारोह के लिए तर्क सरणी पारित
यहाँ

यह है:

function Timeout(fn, interval, scope, args) { 
    scope = scope || window; 
    var self = this; 
    var wrap = function(){ 
     self.clear(); 
     fn.apply(scope, args || arguments); 
    } 
    this.id = setTimeout(wrap, interval); 
} 
Timeout.prototype.id = null 
Timeout.prototype.cleared = false; 
Timeout.prototype.clear = function() { 
    clearTimeout(this.id); 
    this.cleared = true; 
    this.id = null; 
}; 

[शुरू टिप्पणी से मुक्त प्लग] ओह, और मैं जोड़ने के तरीकों में से प्रोटोटाइप मॉडल का उपयोग कर रहा कक्षाओं के लिए, लेकिन केवल इसलिए कि मैं इसे पसंद करता हूं, क्योंकि मुझे लगता है कि यह अधिक सही नहीं है [अंत टिप्पणी-मुक्त प्लग]

+0

मुझे वास्तव में यह दृष्टिकोण पसंद है क्योंकि यह कितना लचीला है। +1 – Reid

+0

यह उत्तर दिलचस्प है, लेकिन सवाल का जवाब देने के लिए बिंदु को याद करता है, जिसका उल्लेख ऊपर-सामने किया जाना चाहिए ... टाइमआउट को साफ़ करते समय बस हल करने के लिए टी सेट करें और समस्या हल हो गई है। – SuperDuperApps

+0

@ निगेलपेक: मुझे नहीं पता कि यह जवाब "प्रश्न का उत्तर देने में बिंदु को याद करता है"। यह मूल पूछताछ की समस्या का एक उत्कृष्ट समाधान प्रदान करता है। – Reid

-2

टाइमआउट की उपस्थिति की जांच करने का एक और तरीका है। एक टाइमआउट रखने वाला मान डिफ़ॉल्ट रूप से एक संख्या मान है जो समय के साथ बढ़ रहा है।तो हम में आगे क्या कर सकते हैं "अगर" निर्माण:

if (someBooleanValue && !parseInt(@changeToCriteriaTimeout) > 0){ 
    //Do something 
} 
5

बस (या अपने मामले में टी) t0 करने के लिए सेट अपनी टाइमआउट समारोह में:

timeoutID = 0; 

आप clearTimeout का उपयोग करते हैं यह समय समाप्ति सेट आईडी से 0, इसलिए timeoutID === 0 की जांच कर जांच होगी कि क्या इसे या तो साफ़ कर दिया गया है या पूरा किया गया है।

+0

एक और अधिक समझदार समाधान गेविन। वास्तव में जब आप इसे साफ़ करते हैं तो समय-समय पर खुद को नकारने का सुझाव दिए बिना रैपर ऑब्जेक्ट की आवश्यकता नहीं होती है। क्या आसान हो सकता है! – SuperDuperApps

0

कुछ उपयोगकर्ताओं की तरह टिप्पणी में पता चलता है, जब भी समय समाप्ति या तो शुरू हो रहा है (के बाद निर्धारित समय बीत चुका है) या clearTimeout साथ मंजूरी दे दी, false या अधिमानतः null को मैन्युअल रूप से इसे निर्धारित किया है। फिर आप यह देखने के लिए एक सरल if-check कर सकते हैं कि यह सक्रिय है या नहीं। यदि आवश्यक हो तो इसे false/null के रूप में प्रारंभ करना भी याद रखें।

इस के लिए एक छोटे से परीक्षण पेज निर्मित: https://codepen.io/TheJesper/pen/rJzava

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