只有微不足道的性能損失設置的函數調用,例如時間和日期呼籲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!');
});
如果你每隔1秒做一個間隔滴答(這裏說的是前端),性能可能會引起你的關注嗎? –
另外,你爲什麼不喜歡:(僞)*如果是正確的日期>檢查時間>如果正確的時間>做的東西*。如果確切的日期是你關心的,你不應該使用客戶端的日期時間,因爲它可能是假的改變操作系統的日期時間。 –