美文网首页
3将工作添加到事件队列

3将工作添加到事件队列

作者: zelo | 来源:发表于2017-09-28 09:42 被阅读19次

当你创建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
【安全】保密,你懂的。

相关文章

  • 3将工作添加到事件队列

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

  • iOS事件响应机制

    当发生事件后,事件会被添加到UIApplication管理的事件队列中;之后UIApplication从事件队列中...

  • setTimeout使用中的常见问题

    setTimeout基本用法 setTimeout即超时调用,浏览器会在某个时间后将一个函数添加到事件队列的末尾。...

  • 事件的传递和响应

    事件的传递 当产生触摸事件时, 触摸事件会被添加到由UIApplication管理的事件队列中 UIApplica...

  • iOS --响应链

    当我们单击屏幕时,系统会记录该次的触摸事件,添加到Application的事件队列中,然后从keyWindow开始...

  • iOS UIView事件响应链机制

    流程 点击一个UIView或产生一个触摸事件A,这个触摸事件A会被添加到由UIApplication管理的事件队列...

  • 数据透视表制作步骤

    1、选择数据区 2、插入选择数据透视表 3、将分析项添加到行,将数据项添加到值区域即可

  • IOS事件传递和响应

    1、触摸屏幕产生触摸事件 触摸屏幕产生触摸事件后,触摸事件会被添加到由UIApplication管理的事件队列中(...

  • AngularJS步骤03---05

    步骤3——把模板添加到组件 步骤3——把模板添加到组件 工作区切换到步骤3 app/index.html 我们继续...

  • git常用命令

    用于显示工作目录和暂存区的状态(查看更改文件) 将文件内容添加到索引(将修改文件添加到暂存区)。 将更改记录(提交...

网友评论

      本文标题:3将工作添加到事件队列

      本文链接:https://www.haomeiwen.com/subject/ohlmextx.html