2015-12-15 16 views
8

Có cách nào để tìm hiểu xem có bộ hẹn giờ hoạt động không?Kiểm tra xem có thời gian chờ hoạt động trong Javascript

Tôi có n-giờ với khoảng thời gian khác nhau, ví dụ:

Timer 1 -> 2-sec 

Timer 2 -> 8-sec 

.. 

... 

Timer n -> n-sec 

Tôi cần phải biết khi tất cả giờ đã kết thúc

HTML

<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> 

JS

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

Lưu ý: Tôi cần giải pháp cho ví dụ cụ thể này vì trong dự án của tôi có n số của file js mà có thể có tính giờ được công bố như ví dụ này

+2

Tôi không tin rằng nó có thể để xác định xem một bộ đếm thời gian hoạt động từ tham chiếu đến nó, như tài liệu tham khảo chỉ là một số nguyên không có tài sản.Nếu bạn có thể cung cấp chi tiết về những gì bạn đang tìm kiếm để đạt được, chúng tôi có thể đề xuất một giải pháp thay thế. –

+0

Nếu thời gian chờ của bạn không bị so le/bị trì hoãn, bạn có chỉ cần kiểm tra xem thời gian chờ * dài nhất có xảy ra không? Trong trường hợp đó, bạn chỉ có thể chuyển đổi một giá trị Boolean dựa trên đó. – Quantastical

+1

@Quantastical Có thể cho kết quả bất ngờ http://ejohn.org/blog/how-javascript-timers-work/ –

Trả lời

7

Đây là cách tôi' d làm điều đó, tạo một trình bao bọc xung quanh các hàm gốc

(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); 

Sau đó, sử dụng nó như

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

Có thể này sẽ giúp bạn.

//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

Một công việc hợp lệ xung quanh. –

+0

Ý bạn là 'count = 2', đúng không ?! –

+0

vâng tôi đã thực hiện chỉnh sửa –

1

Bạn luôn có thể thêm các biến kiểm soát.

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

Chờ đợi, tại sao nó lại bị bỏ qua ??? Có vẻ như cách giải quyết hợp lệ, có thể không phải là tốt nhất nhưng hợp lệ –

1

Tôi sẽ làm điều này với promises mà jQuery cung cấp. Cân nhắc jsfiddle này: https://jsfiddle.net/734y1oqy/

Đầu tiên chúng ta tạo một mảng cho promise objects:

var timers = []; 

Sau đó, chúng tôi tạo ra các promise objects mình:

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

Đẩy họ mảng:

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

Tạo bộ hẹn giờ như bình thường, nhưng có hẹn giờ giải quyết đối tượng hứa hẹn tương ứng:

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); 

Tạo một điều rằng "đồng hồ" khi mỗi lời hứa trong mảng hứa hẹn được giải quyết:

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

Thông tin thêm: https://api.jquery.com/category/deferred-object/

Các vấn đề liên quan