2010-10-26 53 views
7

Ok, câu hỏi thực sự đơn giản. Tôi đang tham gia một khóa học sụp đổ trong javascript.Làm cách nào để biết bộ hẹn giờ bị xóa hoặc hết thời gian trong javascript?

Nếu tôi sử dụng timer = setTimeout(..., 500) để đặt hẹn giờ, và sau đó clearTimeout(timer) để xóa bộ hẹn giờ, giá trị số nguyên của bộ hẹn giờ không thay đổi, vì vậy câu hỏi của tôi là làm thế nào để biết bộ hẹn giờ đã hết hạn hay chưa?

Tôi muốn sử dụng if (timer) {...}, nhưng rõ ràng là một số nguyên dương luôn trả về giá trị đúng.

Trả lời

12

Nếu bạn đang tìm kiếm cái gì trang trọng hơn, bạn có thể xây dựng javascript lớp mà đóng gói các chức năng setTimeout/clearTimeout.

một lớp học như vậy có thể trông giống như thế này:

/** class Timer **/ 
var Timer = function(delayMs, callbackFunc) { 
    this.delayMs = delayMs; 
    this.callbackFunc = callbackFunc; 
    this.timerState = 'new'; 
} 
Timer.prototype.start = function() { 
    if(this.tmr) return; 

    var self = this; 
    this.timerState = 'running'; 
    this.tmr = setTimeout(function() { self._handleTmr(); }, this.delayMs); 
} 
Timer.prototype.cancel = function() { 
    if(! this.tmr) return; 

    clearTimeout(this.tmr); 
    this.tmr = null; 
    this.timerState = 'canceled'; 
} 
Timer.prototype._handleTmr = function() { 
    this.tmr = null; 
    this.timerState = 'completed'; 
    this.callbackFunc(); 
} 

Tôi cũng đã bao gồm một thuộc tính timerState mà sẽ cho phép bạn dễ dàng xác định xem bộ đếm thời gian đã "hoàn thành" hoặc "hủy".

Bạn sẽ sử dụng nó như thế này:

var t = new Timer(500, function() { 
    alert('timer completed'); 
}); 
t.start(); 

// do whatever... 

// now cancel the timer if it hasn't completed yet. 
t.cancel(); 

// maybe you do some other stuff... 
// then check the timerState, and act accordingly. 
// 
if(t.timerState == 'canceled') { 
    alert("the timer was canceled!"); 
} else { 
    alert("the timer completed uneventfully."); 
} 

Bạn có thể mở rộng ý tưởng cơ bản giống nhau bao gồm chức năng bổ sung nếu bạn cần nó (ví dụ hẹn giờ lặp lại, start/stop/resume, vv.)

+0

Tôi sẽ không ngạc nhiên chút nào nếu jQuery hoặc một trong các khung công tác JS khác có thứ gì đó như thế này. Bất kỳ chuyên gia jQuery biết nếu nó tồn tại hay không? – MatrixFrog

+0

Điều này thực sự toàn diện. Cảm ơn! – lai

0

Nếu bạn xóa hết thời gian chờ, cuộc gọi lại sẽ không được thực hiện. Vì vậy, nếu gọi lại được thực hiện, có nghĩa là 500ms đã trôi qua kể từ khi bạn đặt thời gian chờ.

Ví dụ:

var timer = setTimeout(function() { 
    alert('you will never see this alert'); 
}, 500); 
clearTimeout(timer); 
4

assign null đến giờ sau khi clearTimeout(timer)

+0

Đây là những gì tôi đang sử dụng ngay bây giờ. Nó có vẻ giống như một suy nghĩ trong Javascript. Có cách nào tốt hơn để xử lý việc này không? – lai

+0

không phải là tôi biết, xin lỗi: Tôi nghĩ rằng xử lý trong Win32 cư xử như nhau :) –

0

Đây là thứ mà tôi sử dụng cho các sự kiện hẹn giờ! Hi vọng điêu nay co ich.

var toggleTimeOut = (function() { 

    var _timeout; 

    return function (clear_timeout) { 

     if(!clear_timeout) 
     { 
     _timeout = setTimeout(function() {/*DO YOUR STUFF*/}, 5000); 
     } 
     else 
     { 
     if(typeof _timeout != typeof undefined && _timeout != 0) 
     { 
      clearTimeout(_timeout); 
      _timeout= 0; 
     } 
     } 
    } 
    })(); 
Các vấn đề liên quan