2015-12-15 6 views
8

में सक्रिय टाइमआउट है या नहीं, क्या सक्रिय टाइमर हैं या नहीं यह पता लगाने का कोई तरीका है?जांचें कि जावास्क्रिप्ट

मैं अलग अवधियों वाली एन-टाइमर है, उदाहरण के लिए:

Timer 1 -> 2-sec 

Timer 2 -> 8-sec 

.. 

... 

Timer n -> n-sec 

मुझे पता है कि जब सभी टाइमर समाप्त कर लें की जरूरत

एचटीएमएल

<div id="time-out-1"> 
    Time out 1:<span></span> 
</div> 

<div id="time-out-2"> 
    Time out 2:<span></span> 
</div> 

<button> 
    Are all timers finished ? 
</button> 

जे एस

setTimeout(function() { 
     $("#time-out-1 span").text("Finished !"); 
},2000); 


    setTimeout(function() { 
     $("#time-out-2 span").text("Finished !"); 
},8000); 

$('button').click(function(){ 
     // if all timers are finished 
     // do something 
}); 

Jsfidle

नोट: मैं क्योंकि मेरी परियोजना में इस विशिष्ट उदाहरण के लिए समाधान की जरूरत है वहाँ js फ़ाइलों की संख्या n टाइमर कि इस उदाहरण की तरह घोषित किया गया है हो सकता है जो कर रहे हैं

+2

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

+0

यदि आपके टाइमआउट्स को परेशान/देरी नहीं हुई है, तो क्या आपको यह देखने की आवश्यकता नहीं होगी कि * सबसे लंबा * टाइमआउट हुआ है या नहीं? इस मामले में, आप उस पर आधारित एक बूलियन मान को टॉगल कर सकते हैं। – Quantastical

+1

@Quantastical अप्रत्याशित परिणाम दे सकता है http://ejohn.org/blog/how-javascript-timers-work/ –

उत्तर

7

यहाँ मैं कैसे 'है डी करते हैं, देशी कार्यों के चारों ओर एक रैपर बनाएं

(function(w) { 
    var active = {}; 

    var _setTimeout = w.setTimeout; 
    var _clearTimeout = w.clearTimeout; 

    w.setTimeout = function(fn, delay) { 
     var id = _setTimeout(function() { 
      fn(); 
      delete active[id]; 
     }, delay); 
     active[id] = true; 
     return id; 
    } 

    w.clearTimeout = function(id) { 
     delete active[id]; 
     _clearTimeout(id); 
    } 

    w.activeTimers = function() { 
     return Object.keys(active).length > 0; 
    } 
})(window); 

फिर जैसे

setTimeout(function() { 
    $("#time-out-1 span").text("Finished !"); 
},2000); 


setTimeout(function() { 
    $("#time-out-2 span").text("Finished !"); 
},8000); 

$('button').click(function(){ 
    if (window.activeTimers()) { 
     // still something going on 
    } else { 
     // all done ! 
    } 
}); 

FIDDLE

2

इस हो सकता है आपकी सहायता करेगा।

//if n Timer then take count n 
var count = 2; 

setTimeout(function() { 
     count--; 
     $("#time-out-1 span").text("Finished !"); 
},2000); 


    setTimeout(function() { 
     count--; 
     $("#time-out-2 span").text("Finished !"); 
},8000); 

$('button').click(function(){ 
     //Check if all Timers are finished 
     if(count==0) 
     //finished 
}); 
+0

एक वैध काम आसपास है। –

+0

आपका मतलब है 'गिनती = 2', है ना? –

+0

हाँ मैंने संपादित किया है –

1

आप हमेशा नियंत्रण चर जोड़ सकते हैं।

var timer1_active = true, 
    timer2_active = true; 
setTimeout(function() { 
    timer1_active = false; 
    $("#time-out-1 span").text("Finished !"); 
},2000); 


setTimeout(function() { 
    timer2_active = false; 
    $("#time-out-2 span").text("Finished !"); 
},8000); 

$('button').click(function(){ 
    //Check if all Timers are finished 
    var finished = !timer1_active && !timer2_active; 
}); 
+2

रुको, यह डाउनवॉटेड क्यों है ??? ऐसा लगता है कि वैध वर्कअराउंड, शायद सबसे अच्छा लेकिन मान्य नहीं है –

1

मैं यह promises के साथ ऐसा करता हूं जो jQuery प्रदान करता है। इस jsfiddle पर विचार करें: https://jsfiddle.net/734y1oqy/

पहले हम promise objects के लिए एक सरणी बनाने के लिए: हम बना तो

var timers = []; 

promise objects खुद को:

timers.push(timer1promise); 
timers.push(timer2promise); 
timers.push(timer3promise); 
:

var timer1promise = $.Deferred(); 
var timer2promise = $.Deferred(); 
var timer3promise = $.Deferred(); 

उन्हें सरणी के लिए पुश

सामान्य जैसे टाइमर बनाएं, लेकिन प्रत्येक को बनाएं

var timer1 = setTimeout(function() { console.log('timer 1 finished'); timer1promise.resolve(); }, 1000); 
var timer2 = setTimeout(function() { console.log('timer 2 finished'); timer2promise.resolve(); }, 2000); 
var timer3 = setTimeout(function() { console.log('timer 3 finished'); timer3promise.resolve(); }, 3000); 

एक बात यह है कि "देखता है" जब वादा सरणी में हर वादा हल हो गई है बनाएँ:: टाइमर इसी वादा वस्तु को हल

$.when.apply($, timers).then(function() 
{ 
    console.log('All timers done!'); 
}); 

और जानकारी: https://api.jquery.com/category/deferred-object/

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