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 函數(shù)運轉的最短周期是 5ms 左右,HTML確實也有這樣的規(guī)范
,最近不能上外網,暫時沒有驗證。不清楚為什么console會跑那么快。
2.被阻塞問題
單線程的環(huán)境會導致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;
這次的結果都很統(tǒng)一,都在2010左右。Chrome非常穩(wěn)定,最高也不超過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環(huán)境都捕捉到了錯誤···
try{
setTimeout(function(){
throw new Error("我不希望這個錯誤出現(xiàn)!")
}, 1000);
} catch(e){
console.log(e.message);
}