3将工作添加到事件队列

2017-09-28  本文已影响19人  zelo

当你创建Node.js应用和设计代码时,要利用事件模型的可拓展性和性能,要确保把工作分解成可以作为一系列的回调来执行的块。

当你正确的设计代码时,可以使用事件模式来在事件队列上调度工作。在Node.js应用程序中,你可以使用下列办法传递回调函数来在事件队列中调度工作:

  1. 对阻塞I/O库调用之一做出调用,如写入文件或连接到一个数据库。
  2. 对内置的事件,如http.request 或server.connection添加一个事件监听器。
  3. 创建自己的事件发射器并对他们添加自定义的监听器
  4. 使用process.nextTick选项来调度在事件循环的下一次循环中被提取出来的工作
  5. 使用定时器调度在特定的时间数量或每隔一段时间后要做的工作。

实现定时器

  1. 用超时时间来延迟工作
setTimeout(myFunc, 1000);

1秒后执行myFunc()

  1. 用时间间隔执行定时工作

每秒执行一次myFunc()

setInterval(myFunc,1000);
  1. 使用即时计时器立即执行工作
    你可以使用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");

把事件监听器添加到对象

  1. addListener(eventName, callback):将回调函数俯角到对象的监听器中。每当eventName事件被触发时,回调函数就被放置在事件队列中知行。
  2. .on(eventName,callback): 同addListener
  3. .once(eventName,callback): 只有eventName事件第一次被触发时回调函数才被放置在事件队列中知行。
function myCallback(){
    ...
}
var myObject = new MyObj();
myObject.on("someEvent",myCallback);

从对象中移除监听器

监听器非常有用 但他们会导致开销,应该只在必要的时候使用它们,Node.js在EventEmitter对象上提供了多个辅助函数来让你管理包含的监听器。

  1. .listeners(eventName): 返回一个连接到eventName事件的监听器函数的数组
  2. .setMaxListeners(n):如果多于n的监听器都加入到EventEmitter对象,就会触发警报。n默认值为10;
  3. .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
【安全】保密,你懂的。

上一篇下一篇

猜你喜欢

热点阅读