2013-01-10 92 views
3

我有一個計時器功能,我想清除超時或重置功能,導致我每次執行它時,會創建一個新的超時時間,所以我收到幾大罪狀。 我的想法是每次執行該功能時重置計數。我只想要一個定時器實例並獲得正確的計數。如果如果執行好幾次我要重新啓動0清除的setTimeout或復位功能

功能這裏是我的代碼:

var timeouts = new Array(); 
var timer = null; 

io.sockets.on('connection', function (client) 
{ 
    client.on("start", function(){ 
    console.log('Someone has pressed Start button',new Date().getTime()); 

     //try to kill all timeouts 
     for (var timeout in timeouts) { 
      clearTimeout(timeout); 
     }; 

     if(this.timer == null) { 
      this.timer = new timer(1000, function (data) { 
       io.sockets.emit('timeupdate', data); 
      }) 
     }else { 
      this.timer = null; 
    }); 
}); 


function timer(delay, callback) 
{ 
    // self-reference 
    var self = this; 

    if (!(this instanceof timer)) { 
     return new timer(); 
    } 
    // attributes 
    var counter = 0; 
    var start = new Date().getTime(); 

    /** 
    * Delayed running of the callback. 
    */ 
    function delayed() 
    { 
     console.log(counter); 
     callback(counter); 
     counter ++; 
     var diff = (new Date().getTime() - start) - counter * delay; 
     var timeOut = setTimeout(delayed, delay - diff); 
     timeouts.push(timeOut); 
    } 

    // start timer 
    delayed(); 
    var timeout = setTimeout(delayed, delay); 
    timeouts.push(timeout); 
} 

預先感謝您。

回答

2

使用clearTimeout()是正確的做法。問題是您的for -loop。這可能看起來像經典的foreach -loop,但事實並非如此。你要做的:

for (var i=0; i< timeouts.length; i++) { 
    clearTimeout(timeouts[i]); 
} 

另外,還我個人不喜歡這樣的:

for (var i in timeouts) { 
    clearTimeout(timeouts[i]); // note how the array is indexed using var i 
} 

這是一個常見的JavaScript陷阱 - 在for (x in y) -loop實際上遍歷數組的索引,而不是值。它也可以迭代對象的屬性。試試看:

var a = [3, 2, 5, 8]; 

for (var i in a) { 
    console.log(i); 
    console.log(a[i]); 
} 

var o = { test: 'hello', number: 1234 }; 
for (var x in o) 
    console.log(x);