超時調用是否能完全模擬間歇調用的作用?
首先給出Javascript高級教程的相關論述
間歇調用(setInterval)和超時調用(setTimeout)
//第一個參數可以是包含javascript代碼的字符串,也可為函數。第二個參數是一個等待多長時間的毫秒數
//該方法返回一個數值id 表示(間歇)超時調用,這個id可以用于取消(間歇)超時調用
var timeoutID=setTimeout(function(){
alert('hello world');
},1000);
clearTimeout(timeoutID);//取消超時調用
setInterval(function(){
alert("hello,wrold");
},2000);
//間歇調用會一直執行到頁面卸載,為控制其調用次數,舉例如下
var num = 0;
var max = 10;
var intervalID = null;
function incrementNumber(){
num++;
if(num==max){
clearInterval(intervalID);
alert("Done!");
}
}
intervalID=setInterval(incrementNumber,500);
//超時調用模擬間歇調用
var num = 0;
var max = 10;
var timeoutID=null;
function incrementNumber(){
num++;
if(num<max){
? ?setTimeout(incrementNumber,500);
}
else{
?alert("Done");
}
}
setTimeout(incrementNumber,500);
對比可以發現,使用超時調用時,沒有必要跟蹤超時調用id,因為每次執行代碼之后,如果不再設置另一次超時調用,調用就會自行停止。
一般認為,如果超時調用用來模擬間歇調用的是一種最佳模式。
在開發環境下,很少真正的間歇調用,原因是后一個間歇調用可能會在前一個間隙調用結束之前啟動。
最好不要使用間歇調用。
但是,博主發現,在模擬倒計時類型的程序時,超時調用并不能夠很好的模擬間歇調用的行為。如
var num = 0;
var max = 10;
var intervalID = null;
function incrementNumber(){
num++;
alert("num");//在此處增加一個輸出計數值的代碼
if(num==max){
clearInterval(intervalID);
alert("Done!");
}
}
intervalID=setInterval(incrementNumber,1000);
那么這個程序就能在數10s之后輸出done。
但是使用超時調用模擬時
var num = 0;
var max = 10;
var timeoutID=null;
function incrementNumber(){
num++;
alert(num);
if(num<max)){
setTimeout(incrementNumber,1000);
}
else{
alert("Done");
}
}
setTimeout(incrementNumber,1000);
調試時發現 只有在第一個數字輸出時 才有1s的間隔時間,剩余的數字均未按照間隔時間輸出
可見,超時調用用于模擬間隔調用的結果在其不需要跟蹤ID這方面有著優勢,然而在模擬間隔調用的過程時卻存在著不可避免的問題。
但是假如只需要模擬的是結果,間隔調用的作用本來就不在于單單輸出一個結果。模擬的意義就不大了 。
所以博主認為間隔調用還是有其不可替代的作用的。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?