在Js中,當我們要在一定間隔時間內不斷執行同一函數,我們可以使用setInterval函數,但setInterval在某些情況下使用時也存在一定問題。
在某些情況下,函數可能需要比間隔時間更長的時間去完成執行。比如說是用setInterval每隔5秒對遠端服務器進行輪詢,網絡延遲,服務器無響應以及其他因素將會阻止請求按時按成。結果會導致返回一串無必要的排成隊列請求。
2.忽視錯誤
因為某些原因,setInterval調用的代碼中會出現一個錯誤,但是代碼並不會中止執行而是繼續執行錯誤的代碼。
3.缺乏靈活性
除了前面提到的缺點之外,我非常希望setInterval方法能有一個表明執行次數的參數而不是無休止的執行下去。
一個更好的實現
基於上面幾個原因我實現了自己的setInterval函數。它支持一個額外的參數用來標明代碼執行的次數。
function interval(func, w, t){ var interv = function(){ if(typeof t === "undefined" || t-- > 0){ setTimeout(interv, w); try{ func.call(null); } catch(e){ t = 0; throw e.toString(); } } }; setTimeout(interv, w); };
這個interval函數有一個叫做inter的內部函數,它通過setTimeout來自動被調用,在inter中有一個閉包,它檢查了重復次數,調用了回調函數並通過setTimeout再次調用了interv。萬一回調函數中出現了一個異常,interv調用將會終止,異常也會被拋出。
這種木事當然不能保證函數在固定的間隔中執行,但是它保證新的區間開始時上一個區間中的函數已經執行完畢,我認為這是非常重要的。
用法
現在我們可以在10秒的區間內執行一段代碼5次,代碼如下:
interval(function(){ //執行的代碼在這 },1000,10);
引用資料:http://www.thecodeship.com/web-development/alternative-to-javascript-evil-setinterval/