利用setTimeout來實現setInterval


  在Js中,當我們要在一定間隔時間內不斷執行同一函數,我們可以使用setInterval函數,但setInterval在某些情況下使用時也存在一定問題。

1.不去關心回調函數是否還在運行

在某些情況下,函數可能需要比間隔時間更長的時間去完成執行。比如說是用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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM