Node中的定時器詳解


    在大多數的業務中,我們都會有一些需求,例如幾秒鍾實現網頁的跳轉,幾分鍾對於后台數據進行清理,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 ,盧濤  李穎 譯,在此對本書的作者以及翻譯者表示感謝。

    

    

    

 


免責聲明!

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



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