2015-10-17 46 views
0

我真搞不清楚這一點,但我敢肯定有一個解釋。我正在開發一個個人培訓webapp,我有一個計時器,每次到達00:00時,它應該去00:10並停止。使用此功能的定時器作品我寫道:的Javascript:功能工作有時,和其他時間只是沒有做任何事情

//timer object function 
 
function Timer(element, callback) { 
 

 
    var ac, minutes, seconds, finalTimeInSeconds, displayMinutes, displaySeconds, interval = 1000, 
 
    self = this, 
 
    timeLeftToNextSecond = 1000, 
 
    running = false; 
 

 
    this.set = function(inputMinutes, inputSeconds) { 
 

 
    finalTimeInSeconds = inputMinutes * 60 + inputSeconds; 
 
    minutes = (Math.floor(finalTimeInSeconds/60)); 
 
    seconds = finalTimeInSeconds % 60; 
 

 
    this.print(); 
 
    } 
 

 
    this.add = function(inputMinutes, inputSeconds) { 
 

 
    finalTimeInSeconds += inputMinutes * 60 + inputSeconds; 
 
    finalTimeInSeconds = (finalTimeInSeconds < 0) ? 0 : finalTimeInSeconds; 
 
    minutes = (Math.floor(finalTimeInSeconds/60)); 
 
    seconds = finalTimeInSeconds % 60; 
 

 
    this.print(); 
 
    } 
 

 
    this.subtract = function(inputMinutes, inputSeconds) { 
 

 
    finalTimeInSeconds -= inputMinutes * 60 + inputSeconds; 
 
    if (finalTimeInSeconds < 0) { 
 
     callback() 
 
    } 
 
    finalTimeInSeconds = (finalTimeInSeconds < 0) ? 0 : finalTimeInSeconds; 
 
    minutes = (Math.floor(finalTimeInSeconds/60)); 
 
    seconds = finalTimeInSeconds % 60; 
 
    this.print(); 
 
    } 
 

 
    this.reset = function() { 
 

 
    this.set(0, 0); 
 
    } 
 

 
    this.print = function() { 
 

 
    displayMinutes = (minutes.toString().length == 1) ? "0" + minutes : minutes; //ternary operator: adds a zero to the beggining 
 
    displaySeconds = (seconds.toString().length == 1) ? "0" + seconds : seconds; //of the number if it has only one caracter. 
 

 
    $(element).text(displayMinutes + ":" + displaySeconds); 
 
    } 
 

 
    this.run = function() { 
 

 
    if (running == false) { 
 
     running = true; 
 

 
     var _f = function() { 
 
     secondStarted = new Date; 
 
     self.subtract(0, 1); 
 
     interval = 1000; 
 

 
     ac = setTimeout(_f, interval); 
 

 

 
     } 
 
     ac = setTimeout(_f, interval); 
 

 

 
    } 
 
    } 
 

 
    this.stop = function() { 
 

 
    if (running == true) { 
 
     running = false; 
 
     console.log(this + "(" + element + ") was stopped"); 
 
     stopped = new Date; 
 
     interval = 1000 - (stopped - secondStarted); 
 
     clearTimeout(ac); 
 
    } 
 
    } 
 

 
    this.getTotalTimeInSeconds = function() { 
 

 

 
    return finalTimeInSeconds; 
 
    } 
 

 
    this.reset(); 
 

 
}

我所做的就是創建這樣一個計時器:

globalTimer = new Timer("#globalTimer", function() { 
      globalTimer.stop(); 
      globalTimer.set(0,10); 
     }); 

然後我將它設置爲00:15並運行它:

globalTimer.set(0,15); 
globalTimer.run(); 

並且對於某些原因,當計時器達到零時,它將設置爲00:10,但不會停止。事情是,在它到達00:00之前,我可以用控制檯停下來,它完美的工作;但是當計時器變爲零時,.stop()函數就不再起作用了。點擊here進行演示。爲什麼會發生? Timer函數有什麼問題嗎?非常感謝。

回答

0

原因是變量running仍設置爲false, 只需在關閉停止函數中的if語句後添加以下行。

running = true; 

這裏是代碼提取。

this.stop = function() { 
    if (running == true) { 
     running = false; 
     console.log(this + "(" + element + ") was stopped"); 
     stopped = new Date; 
     interval = 1000 - (stopped - secondStarted); 
     clearTimeout(ac); 
    } 
    running = true; 
} 
+0

但我希望'running'在定時器停止時爲false,否則在變量中沒有任何意義。 –

+0

如果將運行變量設置爲true,當函數執行變量設置爲false時,停止函數()將僅運行,並且它將保持整個代碼的這種方式,這就是爲什麼在應用程序之後將其重置爲true的原因該函數中的代碼將執行,以便在函數再次達到00.00後再次調用時,if語句條件可以檢查爲true。您可以嘗試在if ie alert(running)之前提醒運行變量的值; if(...看看它的值是多少 – domii

+0

我已檢查過您的代碼,並確定該變量不是必需的,因爲它是唯一的使用功能,但如果它的價值上的依賴就像另一個函數集(),這將僅是語義的目的,即其停止不會停止功能是相同的值設置爲運行,但在功能上是相同的。 – domii

1

在setTimeout回調函數中添加一個簡單的檢查到'running'變量應該就足夠了。我想你可能會對setTimeout和setInterval之間的區別有些困惑。

我只是從你的'stop'函數中刪除了clearTimeout,因爲它不是必需的,並且改變了你的'run'函數來檢查你的'globalTimer'是否'正在運行'並且它按照你所描述的那樣工作。

this.run = function() 
{ 
    var _f = function() { 
     secondStarted = new Date; 
     self.subtract(0, 1); 
     interval = 1000; 

     var theColorIs = $(element).css("color"); 
     if (running == true) 
     { 
      ac = setTimeout(_f, interval); 
     } 
    } 

    if (running == false) 
    { 
     running = true; 
     ac = setTimeout(_f, interval); 
    } 
} 
+0

但爲什麼沒有按「T我的代碼停止計時,當它達到零,但它確實改變了'running' VAR?這有什麼不作出了意義。 –

+1

這是由於先前的回調完成,當你射擊了另一個setTimeout的回調。'clearTimeout'只會從setTimeout回調函數中刪除(清除)延遲,並不會停止/禁止執行。在此使用'running'變量繞過此循環鏈。有關setTimeout的示例,請查看... https:// developer。mozilla.org/en-US/docs/Web/API/WindowTimers/clearTimeout –

+0

我用setInterval函數結束了工作,它的工作原理很完美,但是你的回答幫助我達到了這個目標,並且幫助我解決了這個令我感到沮喪的問題。非常感謝:-) –

相關問題