在大多數的業務中,我們都會有一些需求,例如幾秒鍾實現網頁的跳轉,幾分鍾對於后台數據進行清理,node與javascript都具有將代碼延遲一段時間的能力。在node中可以使用三種方式實現定時功能:超時時間,時間間隔和即時定時器。雖然有這三種定時器功能但是在平常的業務中使用還是有差別的,下來我們就一起討論一下這三種定時器。
1、用超時時間來延遲工作
超時定時器用於將工作延遲一個特定的時間數量,當時間到了,回調函數執行,而定時器會消失。(建議:對於只執行一次的工作,使用超時時間)。
1秒之后執行myFunc,函數
setTimeout(myFunc,1000);
當你調用setTimeout()時,回調函數myFunc會在1000毫秒之后執行。
2、時間間隔執行定期工作
時間間隔定時器用於按照定期的延時時間間隔執行工作,當延遲時間結束時,回調函數被執行,然后再次重新調度該時間為延時時間,相當於一個輪詢功能,定期執行函數。
每秒中執行一次myFunc()
setInterval(myFunc,1000);
setInterval()函數會返回一個定時器對象ID,利用這個clearInterval(id)可以取消時間間隔定時器
例如:
id = setInterval(myFunc,1000);
clearInterval(id);
3、使用即時計時器立即執行工作
即時計時器用來在I/O事件的回調函數開始執行后,單任何超時間時間或者間隔時間事件被執行之前,立即執行工作。它們允許你把工作調度為在事件隊列中的當前事件完成之后執行。
setImmediate(myFunc,1000);
代碼調度myFunc()在遍歷時間隊列的下一個周期內執行。
注意:還有一個是nextTick來調度工作
在事件隊列上調度工作的一個非常有用的辦法就是使用process.nextTick(callback)函數,這個函數可能會導致I/O的飢餓,所以node通過設置默認值為1000的process.maxTickDepth來限制事件隊列的每次循環可執行的nextTIck()的數目。
接下來寫一個小的Demo來看看這幾個定時器的一些區別。
1 console.log('成功開啟node,端口號:'+app.get('port')); 2 setImmediate(function(){ 3 console.log("setImmediate1"); 4 },1000); 5 process.nextTick(function(){ 6 console.log("nextTick1"); 7 }); 8 setImmediate(function(){ 9 console.log("setImmediate2"); 10 },1000); 11 process.nextTick(function(){ 12 console.log("nextTick2"); 13 }); 14 console.log("---------------");
運行結果如下:
從上面的結果中可以看到,首先輸出的是兩個nextTick(),也就是說,這個函數在任何調用之前執行,之后是兩個setImmediate()。這就好比是說,nextTick()函數提前進入了VIP倉,提前登機了~(哈哈~~這句比喻是在和大牛們的討論中出來的,便於大家理解,要是有說的不清楚的地方,請大家批評指正。)
注:本文的參考資料來源是《Node.js+MongoDB+AngularJS Web開發》,作者:Brad Dayley ,盧濤 李穎 譯,在此對本書的作者以及翻譯者表示感謝。