2016-09-01 92 views
2

我正在開發一個應用程序與jQuery手機和科爾多瓦,我在我的應用程序(這是一個插件添加到我的項目)倒計時,我想當這個計時器達到10秒,一個特定的功能被稱爲。第一個選項是我每秒都會檢查倒計時,但是對於一些性能問題是不可能的,這不是很合理,因爲我的倒計時可能顯示5天。另一種選擇是使用setTimeout,但我認爲這會降低性能。不會嗎? 假設setTimeout(function{//function call}, 14400000)只是4個小時,更不用說天。在特定的時間(和日期)調用函數

如果確實降低了性能,我還有其他選擇嗎? 有沒有像javascript或jQuery的node.js中的crone的東西,所以我們可以指定一個時間和日期來調用函數?

我的意思是,這將是很好,如果我能在2016年9月1日15時10分四十零秒

TNX

+0

如果你每隔1秒做一個間隔滴答(這裏說的是前端),性能可能會引起你的關注嗎? –

+0

另外,你爲什麼不喜歡:(僞)*如果是正確的日期>檢查時間>如果正確的時間>做的東西*。如果確切的日期是你關心的,你不應該使用客戶端的日期時間,因爲它可能是假的改變操作系統的日期時間。 –

回答

1

只有微不足道的性能損失設置的函數調用,例如時間和日期呼籲setTimeout。解決您描述的問題的最佳方法是計算當前時間和您要執行代碼的時間之間的毫秒數,並且使用該值作爲超時值呼叫setTimeout。但是,有一個必須注意的問題,正如@Vld所述:延遲參數由某些瀏覽器以32位整數存儲,所以我們需要解決該問題並定期重新創建超時,直到達到我們想要的日期。

此外,您必須注意,示例代碼中用於futureDate參數的日期採用UTC時區,因此在使用它之前,請務必將當地時間轉換爲UTC。一個好的圖書館可以使用的是Moment.js

下面的代碼:

function scheduleExecution(futureDate, callback) { 
    // Set an intermediary timeout at every 1 hour interval, to avoid the 
    // 32 bit limitation in setting the timeout delay 
    var maxInterval = 60 * 60 * 1000; 
    var now = new Date(); 

    if ((futureDate - now) > maxInterval) { 
     // Wait for maxInterval milliseconds, but make 
     // sure we don't go over the scheduled date 
     setTimeout(
      function() { scheduleExecution(futureDate); }, 
      Math.min(futureDate - now, maxInterval)); 
    } else { 
     // Set final timeout 
     setTimeout(callback, futureDate - now); 
    } 
} 

// This example uses time zone UTC-5. Make sure to use the 
// correct offset for your local time zone 
var futureDate = new Date("2020-09-01T17:30:10-05:00"); 
scheduleExecution(futureDate, function() { 
    alert('boom!'); 
}); 
+0

您發佈的示例不會真正起作用。提前你可以設置的最大時間是[2147483647毫秒](http://stackoverflow.com/questions/39007056/is-there-a-maximum-delay-limit-for-window-setinterval/39007143#39007143)這是大約大約24天。所以,如果你想在將來設置「遠」,確保它在大約三週到三週半之內。 – vlaz

+0

我不認爲這是真的。 setTimeout的delay參數似乎沒有任何限制(請參閱https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout),因此您可以將其設置爲最大數值支持JavaScript,1.7976931348623157e + 308。這應該會讓你足夠及時。 – AdrianT

+0

我在鏈接的答案中的文字完全來自您現在將我鏈接到的文章。檢查標題「最大延遲值」下的頁面底部。 – vlaz

0
  1. 沒有與運行的腳本沒有顯著的性能問題每秒,只要所執行的腳本是檢查一樣簡單,如果它達到的願望時。
  2. 我沒有看到使用setTimeout的任何性能問題,您可以根據自己的喜好進行設置,並且絕對不會影響性能。
+0

謝謝您的回答 – hsbr13

相關問題