setTimeout與setInterval初探

setTimeout與setInterval的一些缺點

1.及時性問題

會存在不及時響應的問題

var d = new Date,count = 0,f,timer;
timer =  setInterval(f = function(){
    if(new Date - d > 1000){
        clearInterval(timer);
        console.log(count);
    }
    count++;
},0);

控制臺:


Paste_Image.png

Node:


Paste_Image.png

原作者博客

Paste_Image.png

時間的差距還是比較大的,原博客中說setInterval 和 setTimeout 函數運轉的最短周期是 5ms 左右,HTML確實也有這樣的規范,最近不能上外網,暫時沒有驗證。不清楚為什么console會跑那么快。

2.被阻塞問題

單線程的環境會導致setTimeout被阻塞

var d = new Date;
setTimeout(function(){
    console.log('show me after 1 sec,but you know:' + (new Date - d));
},1000);

while(1)
    if(new Date - d > 2000)
        break;

這次的結果都很統一,都在2010左右。Chrome非常穩定,最高也不超過2003。但阻塞是肯定存在的。

其實被阻塞的問題還是需要多說一下。做過一個關于搜索延遲的東西,要求在輸入框一段時間內沒有輸入動作的時候,自動搜索輸入框內容。
我考慮到了用setTimeout來做(大多是考慮用閉包來做)
想法是:

每當有一個新的輸入,便去清除上一個定時器。

試驗代碼如下:

window.onload = function(){

    var dom = document.getElementById("test");
    var body = document.getElementsByTagName('body');
    
    var TimeOutconut = 0;
    var Changeconut = 0;
    dom.addEventListener("keydown",function(){
        console.log(Changeconut++);
        var date = new Date();
        var dirty = setTimeout(function(){
            console.log(new Date() - date);
            clearTimeout(dirty);
            console.log(TimeOutconut++);
        },5000);
    });
};

結果:

Paste_Image.png

很清楚的看到setTimeout是不阻塞的,輸入了三次,三次結果在5秒后幾乎同時返回。

修改后代碼如下:

 window.onload = function(){

    var dom = document.getElementById("test");
    var body = document.getElementsByTagName('body');
    var dirty;
    var TimeOutconut = 0;
    var Changeconut = 0;
    dom.addEventListener("keydown",function(){
        console.log(Changeconut++);
        var date = new Date();
        clearTimeout(dirty);
        dirty = setTimeout(function(){
            console.log(new Date() - date);
            console.log(TimeOutconut++);
        },5000);
    });
};

及時清除了定時器,結果只做一次。

3. try..catch捕捉不到他的錯誤

不巧的是,chrome和Node環境都捕捉到了錯誤···

try{
    setTimeout(function(){
        throw new Error("我不希望這個錯誤出現!")
    }, 1000);
} catch(e){
    console.log(e.message);
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容