2012-01-17 61 views
3

我想每10毫秒發一個遞歸函數,但setTimeout似乎沒有采取100以下的任何值,不管我放什麼。Javascript setTimeout不允許100毫秒以內的間隔

decrementCountdown = function() { 
    console.log('fired'); 
    t = setTimeout("decrementCountdown()", 100); 
} 

爲什麼我不能在1000毫秒內設置一個值?

編輯:看起來像我的計時器正確發射......問題是當我用它來調用一個函數(如jquery的html())。儘管setTimeout以正確的時間間隔調用函數,但它不會以超過100毫秒的速度觸發。

任何人都知道我可以在我的頁面上倒數計時器減少10毫秒嗎?

+1

是什麼讓你覺得這不?你的例子沒有證明任何東西。 – j08691 2012-01-17 03:15:42

+0

因爲不管我是放999還是1,它都會以完全相同的速率發射... 1秒。這是一個簡化的例子,我真正的代碼使用這個函數來遞減倒數計時器。如果我把它包括在內,會更有幫助嗎? – zakdances 2012-01-17 03:21:00

回答

7

一個更好的例子是:

var stop = 0; 
decrementCountdown = function() { 
    console.log(new Date().getTime()); 
    stop++; 
    if (stop<10) t = setTimeout("decrementCountdown()", 100); 
} 

decrementCountdown(); 

正如你應該看到,超時被觸發大約每100ms(jsFiddle)。

1

這裏是一個page you can run,它會告訴你在您的系統上的瀏覽器中setTimeout()的變化是什麼。它運行10000 setTimeout(fn, 1)操作並記錄調用之間的平均,最大和最小延遲並將其輸出到屏幕。

setTimeout()確實有一個最低值,它會尊重。它通過瀏覽器有所不同,但它通常在10-20毫秒範圍內(儘管它可以更小或更大 - 取決於瀏覽器)。這被稱爲「夾緊」。它的目的是保護瀏覽器事件隊列免受太多的JavaScript執行,並沒有足夠的時間去做其他事情(如服務其他用戶事件,重繪等)。

但是,這隻意味着瀏覽器不會比最小值更早觸發一個,並不意味着您將永遠快速獲得一個。 Javascript是單線程的,所以如果瀏覽器很忙,setTimeout()將不會發生,直到沒有更多的JavaScript執行,並且下一個計時器事件到達隊列的前端。

此外,當具有計時器的頁面不是當前選項卡時,計時器將在一些現代瀏覽器中變慢。你可以看到,在上面的頁面切換到另一個標籤時,它正在運行,並看到你得到一個較慢的平均時間。

對於那些好奇,這裏是從該網頁的代碼:

var lastTime = new Date(); 
var cumDiff = 0; 
var minDelta = 1000000; 
var maxDelta = 0; 
var cnt = 0; 
var nowElem = document.getElementById("now"); 
var deltaElem = document.getElementById("delta"); 
var minDeltaElem = document.getElementById("minDelta"); 
var maxDeltaElem = document.getElementById("maxDelta"); 
function run() { 
    var now = new Date().getTime(); 
    var diff = now - lastTime; 
    cumDiff += diff; 
    minDelta = Math.min(diff, minDelta); 
    maxDelta = Math.max(diff, maxDelta); 
    cnt++; 
    var avgDelta = cumDiff/cnt; 
    lastTime = now; 
    nowElem.innerHTML = now; 
    deltaElem.innerHTML = avgDelta.toFixed(1); 
    minDeltaElem.innerHTML = minDelta; 
    maxDeltaElem.innerHTML = maxDelta; 
    if (cnt < 10000) { 
     setTimeout(run, 1); 
    } 
} 
setTimeout(run, 1); 

免責聲明:某些舊的瀏覽器沒有很準確Date()功能(只精確到10-20ms內),所以這個數據韓元在其中一個較舊的瀏覽器中,它不會非常準確。

1

我試過你的例子,它似乎工作正常。

對於什麼是值得我上的setTimeout的不斷重複聲明節約使用

function decrementCountdown() 
{ 
    /*Do your thing*/ 
} 
setInterval(decrementCountdown, 100);