2012-04-08 54 views

回答

6

我假設你正在運行與setInterval沉重的功能,並希望如果前一個沒有完成,跳過一個勾號。

然後,而不是

function yourfoo() { 
    // code 
} 

setInterval(yourfoo, 3000); 

做:

function yourfoo() { 
    // code 
    setTimeout(yourfoo, 3000); 
} 

setTimeout(yourfoo, 3000); 

這保證了未來呼叫沒有計劃,直到前一個完成。

+0

請記住,如果調用隊列中已經有一個setInterval類型的已觸發調用將被丟棄。所以如果你不想讓代碼緊接着執行,如果你的代碼需要比指定的超時更長的時間來完成,那麼重寫就是必要的。否則它並不重要。無論如何:由於JavaScript的單線程特性,您的代碼不會同時執行兩次。 – koenpeters 2012-04-08 11:30:12

+0

沒有下降,只是排隊 – Raynos 2012-04-08 11:55:13

+0

那簡單的解決方案!非常感謝 – Boos93 2012-04-08 12:20:49

1

是的。

這是默認完成的。

它被稱爲JavaScript是單線程的。

兩個函數不能同時運行。

您可能會使用setInterval它將在內部緩衝函數調用,直到任何當前正在運行的代碼完成。

0

您可以定義一個布爾標誌來指示函數在更高範圍內的運行狀態,並相應地打開或關閉它。

+0

這是沒有必要的。兩個功能不能同時運行。你不需要像這樣的鎖定機制。 – Raynos 2012-04-08 11:08:03

0

JavaScript是單線程的,這意味着在給定的時間只有一個JavaScript塊會被執行。所以,即使定時器啓動,代碼的執行也會排隊等待下一個可用時刻。重要的是要知道,如果你使用的是setInterval,只有一個間隔「fire」會被排隊,其他所有的間隔將被丟棄,直到隊列中沒有更多的這種間隔。

這裏是如何工作的jQuery的父親約翰Resig的一個很好的解釋:http://ejohn.org/blog/how-javascript-timers-work/

你可以重寫代碼中使用setTimeout的,因爲你保證,在未來的代碼纔會發生的執行這樣在等待至少規定的毫秒數之後(如果執行被阻止,可以更多)。使用setInterval如果代碼需要很長時間才能完成,則阻塞可能導致代碼的背對背執行。

所以,做這樣的事情,以防止背部到後端執行:

var nrOfMillisecondsToWait = 200; 
setTimeout(function() { 
    .. your code here 
}, nrOfMillisecondsToWait); 
相關問題