我有一個每3秒運行一次的javascript函數,如果函數的前一個實例已經在運行,有沒有辦法做任何事情?如果相同的功能已經在運行,請不要做任何事情
回答
我假設你正在運行與setInterval
沉重的功能,並希望如果前一個沒有完成,跳過一個勾號。
然後,而不是
function yourfoo() {
// code
}
setInterval(yourfoo, 3000);
做:
function yourfoo() {
// code
setTimeout(yourfoo, 3000);
}
setTimeout(yourfoo, 3000);
這保證了未來呼叫沒有計劃,直到前一個完成。
請記住,如果調用隊列中已經有一個setInterval類型的已觸發調用將被丟棄。所以如果你不想讓代碼緊接着執行,如果你的代碼需要比指定的超時更長的時間來完成,那麼重寫就是必要的。否則它並不重要。無論如何:由於JavaScript的單線程特性,您的代碼不會同時執行兩次。 – koenpeters 2012-04-08 11:30:12
沒有下降,只是排隊 – Raynos 2012-04-08 11:55:13
那簡單的解決方案!非常感謝 – Boos93 2012-04-08 12:20:49
是的。
這是默認完成的。
它被稱爲JavaScript是單線程的。
兩個函數不能同時運行。
您可能會使用setInterval
它將在內部緩衝函數調用,直到任何當前正在運行的代碼完成。
您可以定義一個布爾標誌來指示函數在更高範圍內的運行狀態,並相應地打開或關閉它。
這是沒有必要的。兩個功能不能同時運行。你不需要像這樣的鎖定機制。 – Raynos 2012-04-08 11:08:03
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);
- 1. 如果它已經在運行,請不要運行python腳本
- 2. 如果已經運行在JVM中,如何指向相同的運行實例?
- 3. 如果已經運行,請退出VLC
- 4. Incron不要「噸做任何事情
- 5. 功能保持做同樣的事情
- 6. 如果不是終端做任何事情,如何運行一個java類?
- 7. 推遲功能,如果它已經在statechange上運行 - js
- 8. PDO功能新功能沒有做任何事情?
- 9. gclient同步不會做任何事情
- 10. JScrollBar不做任何事情
- 11. 沒有在功能上做任何事情來關閉面板
- 12. 谷歌腳本 - 簡單的功能沒有做任何事情
- 13. jQuery的現成功能沒有做任何事情
- 14. SHEmptyRecycleBin在VB6不會做任何事情
- 15. 尋找任何代碼(javascript/jquery/ajax)喜歡能夠暫停的JavaScript,只有當onclick其他不要做任何事情不要做任何事情
- 16. 如何在dataGridView中覆蓋相同的行如果DateTime已經在行中?
- 17. 功能不會返回每次運行相同的結果
- 18. Javascript - 如果div已經顯示,不要運行代碼?
- 19. 更新/替換行,如果相同的ID已經存在
- 20. 如何在運行時重新執行相同的功能
- 21. 不同的功能,相同的結果
- 22. 相同的功能,不同的結果
- 23. 相同的功能,不同的結果
- 24. AsyncTask執行後做不同的事情?
- 25. $摘要已經運行 - AngularJS
- 26. 光澤功能`animate`似乎沒有做任何事情
- 27. 調用映射功能似乎並沒有做任何事情
- 28. Twitter喜歡註冊 - 不要做任何事情,如果輸入字段留空
- 29. WordPress的add_meta_box不會做任何事情
- 30. jQuery的.serialize()不會做任何事情
代碼...... ????? – noob 2012-04-08 10:53:23
JavaScript代碼永遠不會同時運行,除非您使用網絡工作者......是嗎? – 2012-04-08 10:55:38