3将工作添加到事件队列
当你创建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;
【安全】保密,你懂的。