這篇文章主要介紹了淺談JavaScript中setInterval和setTimeout的使用問題,作者建議在任務(wù)龐大時盡量避免使用setInterval,需要的朋友可以參考下
說到setInterval,就不得不提到setTimeout,二者都是用于定時執(zhí)行某函數(shù),區(qū)別在于setTimeout 只執(zhí)行一次,而setInterval可以一直連續(xù)不斷執(zhí)行下去,典型用法如下:
- function do_sth() { console.log('Hello...'); }
- setTimeout(do_sth, 2500); // 2.5 秒后,執(zhí)行 do_sth 函數(shù)(只執(zhí)行一次)
- setInterval(do_sth, 3500); // 3.5 秒后,執(zhí)行 do_sth 函數(shù)(每隔 3.5 秒執(zhí)行一次,一直執(zhí)行下去)
表面看上去,二者各有各的用途,沒什么問題。但是如果setInterval所執(zhí)行的函數(shù)是比較耗時的動作,setInterval仍然會按照原計劃安排調(diào)用那個函數(shù),而不考慮之前的任何阻塞,這樣隨著時間的推移,隊列中等待執(zhí)行的函數(shù)就會越來越多。而對于此問題解決方案仍然是采用遞歸調(diào)用setTimeout 的方法,如:
- function do_sth() {
- console.log('Hello...'); // 即使這里執(zhí)行比較耗時的動作也沒問題,
- // 等這里執(zhí)行完了才會再去調(diào)用 setTimeout
- setTimeout(do_sth, 2500); // 安排后續(xù)執(zhí)行
- }
- do_sth(); // 初次執(zhí)行
這種遞歸調(diào)用的方式,既可以達到循環(huán)執(zhí)行某函數(shù)的目的,有可以防止后續(xù)任務(wù)不斷堆積。
如果你覺得這種方式有點羅嗦,還可以再寫得精煉一些:
- (function() {
- console.log('Hello...'); // do something here
- setTimeout(arguments.callee, 2500);
- })();
說是這么說,但是如果定時執(zhí)行的任務(wù)開銷很少,setInterval一般是沒什么問題的,但是如果任務(wù)開銷比較大,請務(wù)必使用setTimeout。
新聞熱點
疑難解答
圖片精選