Node.js之EventEmiter

参考:

1. Node.js之EventEmiter讲解

2. Node.js之events事件

3. 在线运行node.js代码

 

Node.js主要API使用异步事件驱动模型,异步I/O操作完成时,或者某些类型对象(触发器)会周期性地,触发一个命名事件到事件队列,用来调用函数对象(监听器)。

比如net.Server对象在每次有新连接时触发一个事件,fs.readStream对象在文件打开时触发一个事件。

所有这些能产生事件的对象都是events.EventEmitter的实例。

所有这些对象开放接口:

 

1. 注册事件名&监听器

on()注册一个事件(名)和一个监听器,添加到监听器数组末尾,addListener()是on()的别名。emit(), 按顺序执行每个监听器。

eventEmitter.on()  // 绑定事件名&监听器

demo source code:

var events = require('events');
var eventEmitter = new events.EventEmitter;
eventEmitter.on('start', function() {
    console.log('eventEmitter starts');
});
eventEmitter.emit('start');

运行结果(打印):

eventEmitter starts

 

2. 给监听器listener传入参数与this

 emit方法允许给监听器传入任意参数,并且标准this会被设置为监听器所附加的EventEmitter。

demo:

var events = require('events');
var eventEmitter = new events.EventEmitter;
eventEmitter.on('start', function(a,b) {
    console.log('eventEmitter starts');
    console.log(a,b,this);
});
eventEmitter.emit('start','a','b');

 

运行结果(打印):

eventEmitter starts
a b { domain: null,
  _events: { start: [Function] },
  _maxListeners: 10 }

 

3. 最多只触发一次的监听器

on注册的监听器可以触发多次,once注册的最多触发一次。

demo

var events = require('events');
var eventEmitter = new events.EventEmitter;
//用on注册事件,绑定监听器
eventEmitter.on('start', function() {
    console.log('eventEmitter starts');
});
eventEmitter.emit('start');
eventEmitter.emit('start');

//用once注册事件,绑定监听器
eventEmitter.once('do', function() {
    console.log('eventEmitter do');
});
eventEmitter.emit('do');
eventEmitter.emit('do');

运行结果输出:

eventEmitter starts
eventEmitter starts
eventEmitter do

 

4. 错误事件

EventEmitter实例发生错误时,会触发名为‘error’的特殊事件。

为防止node.js程序崩溃,建议始终为'error'事件注册监听器。

var events = require('events');
var eventEmitter = new events.EventEmitter;
//用on注册事件,绑定监听器
eventEmitter.on('error', function(err) {
    console.log('eventEmitter err occurs');
});
eventEmitter.emit('error', new Error('programme exception'));

运行输出结果:

eventEmitter err occurs

 

5. 添加监听器/移除监听器事件

当新增监听器时,所有EventEmitter会触发'newListener'事件;当移除监听器时,会触发'removeListener'事件。

demo

var events = require('events');
var eventEmitter = new events.EventEmitter;
//用once注册事件,只会执行一次
eventEmitter.once('newListener', function(event, listener) {
    if(event=='start') {
        eventEmitter.on('start',function(){
            console.log('start 2');
        });
        console.log('start');
    }
});
eventEmitter.on('start',function(){
    console.log('eventEmitter start');
});

eventEmitter.emit('start');

 

运行输出:

start
start 2
eventEmitter start

 

可以看到,触发‘start’事件,会同时触发'newListener'事件,并且on注册事件不会等待,而是直接执行后面的语句。

newListener&removeListener事件触发源
事件名 触发源 备注
newListener

addListener() on()别名
on()  
once() 只执行一次便自行注销
removeListener removeListener()  
removeAllListeners()  
off()

removeListener()别名,v10.0.0添加

 

6. 最大监听器数量

获取最大监听器数量getMaxListeners(),v1.0.0 API才有用,老版本nodejs可能会有编译错误。超出最大数量限制时,可以调用setMaxListeners()重新设置更大值。

 

原文链接: https://www.cnblogs.com/fortunely/p/9433969.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    Node.js之EventEmiter

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/403278

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月21日 上午11:26
下一篇 2023年4月21日 上午11:26

相关推荐