當你創建Node.js應用和設計代碼時,要利用事件模型的可拓展性和性能,要確保把工作分解成可以作為一系列的回調來執行的塊。
當你正確的設計代碼時,可以使用事件模式來在事件隊列上調度工作。在Node.js應用程序中,你可以使用下列辦法傳遞回調函數來在事件隊列中調度工作:
- 對阻塞I/O庫調用之一做出調用,如寫入文件或連接到一個數據庫。
- 對內置的事件,如http.request 或server.connection添加一個事件監聽器。
- 創建自己的事件發射器并對他們添加自定義的監聽器
- 使用process.nextTick選項來調度在事件循環的下一次循環中被提取出來的工作
- 使用定時器調度在特定的時間數量或每隔一段時間后要做的工作。
實現定時器
- 用超時時間來延遲工作
setTimeout(myFunc, 1000);
1秒后執行myFunc()
- 用時間間隔執行定時工作
每秒執行一次myFunc()
setInterval(myFunc,1000);
- 使用即時計時器立即執行工作
你可以使用Node.js中內置的setImmediate(callback,[args])方法創建即時計時器。當調用setImmediate()時回調函數被放置在事件隊列中,并在遍歷事件隊列循環的每次迭代中,在I/O事件有機會被調用后彈出一次
setImmediate(myFunc(),1000);
myImmediate= setImmediate(myFunc);
clearImmediate(myImmediate);
從事件中取消定時器引用
myInterval = setInterval(myFunc);
myInterval.unref();
使用netTick來調度工作
在事件隊列上調度工作的一個非常有用的方法是使用process.nextTick(callback)函數。此函數調度要在事件循環的下一個循環中運行的工作。不想setImmediate()方法,nextTick()在I/O事件被觸發之前知行。這可能會導致I/O事件的饑餓,所以Node.js通過默認值為1000的process.maxTickDepth來限制事件隊列的每次循環可執行的nextTick()事件的數目。
var fs = require("fs");
fs.stat("nexttick.js",function(err,stats){
if(stats) {console.log("nexttick.js Exists");}
});
setImmediate(function(){
console.log(Immediate Timer 1 Executed);
});
setImmediate(function(){
console.log(Immediate Timer 2 Executed);
});
process.nextTIck(function(){
console.log("Next Tick 1 Executed");
})
process.nextTIck(function(){
console.log("Next Tick 2 Executed");
})
實現事件發射器和監聽器
將自定義事件添加到JavaScript對象
事件使用一個EcentEmitter對象來發出。這個對象包含在events模塊中。emit(eventName,[args])函數出發eventName事件,包括所提供的任何參數。如下
var events = require('events');
var emitter = new events.EventEmitter();
emitter.emit("simpleEvent");
//事件添加到JavaScript對象
Function MyObj(){
Events.EventEmitter.call(this);
}
MyObj.prototype._proto_=events.EventEmitter.protoype;
//觸發事件
var myObj = new MyObj();
myObj.emit("someEvent");
把事件監聽器添加到對象
- addListener(eventName, callback):將回調函數俯角到對象的監聽器中。每當eventName事件被觸發時,回調函數就被放置在事件隊列中知行。
- .on(eventName,callback): 同addListener
- .once(eventName,callback): 只有eventName事件第一次被觸發時回調函數才被放置在事件隊列中知行。
function myCallback(){
...
}
var myObject = new MyObj();
myObject.on("someEvent",myCallback);
從對象中移除監聽器
監聽器非常有用 但他們會導致開銷,應該只在必要的時候使用它們,Node.js在EventEmitter對象上提供了多個輔助函數來讓你管理包含的監聽器。
- .listeners(eventName): 返回一個連接到eventName事件的監聽器函數的數組
- .setMaxListeners(n):如果多于n的監聽器都加入到EventEmitter對象,就會觸發警報。n默認值為10;
- .removeListener(eventName,callback): 將callback函數從EventEmitter對象的eventName事件中刪除。
企業級獨立部署應用:知行辦公http://zx.naton.cn
【總監】十二春秋之,3483099@qq.com;
【Master】zelo,616701261@qq.com;
【運營】運維艄公,897221533@qq.com;
【產品設計】流浪貓,364994559@qq.com;
【體驗設計】兜兜,2435632247@qq.com;
【iOS】淘碼小工,492395860@qq.com;iMcG33K,imcg33k@gmail.com;
【Android】人猿居士,1059604515@qq.com;思路的頓悟,1217022114@qq.com;
【java】首席工程師MR_W,feixue300@qq.com;
【測試】土鏡問道,847071279@qq.com;
【數據】fox009521,42151960@qq.com;
【安全】保密,你懂的。