EventEmitter

Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列。

Node.js里面的许多对象都会分发事件:一个net.Server对象会在每次有新连接时分发一个事件, 一个fs.readStream对象会在文件被打开的时候发出一个事件。 所有这些产生事件的对象都是 events.EventEmitter 的实例。

1、EventEmitter 类
EventEmitter 的核心是事件触发与事件监听器功能的封装。
通过require("events");来访问该模块。

2、EventEmitter属性

EventEmitter 的每个事件由一个事件名和若干个参数组成,事件名是一个字符串,通常表达一定的语义。对于每个事件,EventEmitter 支持 若干个事件监听器。

当事件触发时,注册到这个事件的事件监听器被依次调用,事件参数作为回调函数参数传递。

addListener(event, listener)

为指定事件添加一个监听器到监听器数组尾部

on(event, listener)

为指定事件注册一个监听器,接收一个字符串event和一个回调函数

once(event, listener)
为指定事件注册一个单次监听器,即 监听器最多只会触发一次,触发后立刻解除该监听器。

removeListener(event, listener)
移除指定事件的某个监听器,监听器必须是该事件已经注册过的监听器。
它接受两个参数,第一个是事件名称,第二个是回调函数名称。

需要注意的是,此操作将会改变处于被删监听器之后的那些监听器的索引。

removeAllListeners([event])
移除所有事件的所有监听器, 如果指定事件,则移除指定事件的所有监听器。

setMaxListeners(n)
默认情况下, EventEmitters 如果你添加的监听器超过 10 个就会输出警告信息。 setMaxListeners 函数用于提高监听器的默认限制的数量。

listeners(event)
返回指定事件的监听器数组。

emit(event, [arg1], [arg2], [...])
按参数的顺序执行每个监听器,如果事件有注册监听返回 true,否则返回 false。

类方法
listenerCount(emitter, event)
返回指定事件的监听器数量(Number类型)。

实例:

var events = require(‘events‘);

var eventEmitter = new events.EventEmitter();

var listener_1 = function(){
    console.log("监听器1执行");
}

var listener_1_1 = function(){
    console.log("监听器1_1执行");
}

var listener_2 = function(){
    console.log("监听器2执行");
}

eventEmitter.addListener(‘event_1‘, listener_1);
eventEmitter.addListener(‘event_1‘, listener_1_1);

eventEmitter.addListener(‘event_2‘, listener_2);

// eventEmitter.on(‘event_1‘, listener_1);
// eventEmitter.on(‘event_2‘, listener_2);

var lisiten_count = require(‘events‘).EventEmitter.listenerCount(eventEmitter, ‘event_1‘);
console.log("event_1事件绑定了:" + lisiten_count + "个监听器");

eventEmitter.emit(‘event_1‘);
eventEmitter.emit(‘event_2‘);

eventEmitter.removeListener(‘event_1‘, listener_1);
console.log("event_1事件绑定了:" +require(‘events‘).EventEmitter.listenerCount(eventEmitter, ‘event_1‘)+ "个监听器");
 

3、error 事件
EventEmitter定义了一个特殊的事件error,它包含了错误的语义,在遇到异常的时候通常会触发 error事件。
当 error 被触发时,EventEmitter规定如果没有响应的监听器,Node.js会把它当作异常,退出程序并输出错误信息。
我们一般要为会触发 error事件的对象设置监听器,避免遇到错误后整个程序崩溃。例如:

var events = require(‘events‘);

var eventEmitter = new events.EventEmitter();

eventEmitter.emit(‘error‘);  //直接发射一个error事件会抛出一个错误
var events = require(‘events‘);

var eventEmitter = new events.EventEmitter();

var listener_err = function(){
    console.log("error监听器运行");
}

eventEmitter.on(‘error‘, listener_err);
eventEmitter.emit(‘error‘);  //添加监听器后不再抛出错误,直接调用监听器函数
时间: 2024-08-07 11:29:35

EventEmitter的相关文章

node.js EventEmitter发送和接收事件

EventEmitter是nodejs核心的一部分.很多nodejs对象继承自EventEmitter,用来处理事件,及回调.api文档地址: http://nodejs.org/api/events.html#events_class_events_eventemitter Event: Many objects in Node emit events: a net.Server emits an event each time a peer connects to it, a fs.read

node.js 回调函数、事件循环、EventEmitter ar

异步编程  node.js 编程的直接体现就是回调,异步编程依托于回调来实现: node使用了大量的回调函数,所有API都支持回调函数 .如读取文件等. 这里对不懂线程和异步和同步的稍微解释下这三个名词 . 线程 : 简单的说就是做一件事 . 即执行一段程序代码 .js引擎就是一个单线程 的 处理 方式 .单线程是说 同一时间只能做一件事 . 同步 :就是这件事必须要先做完前面的才能做后面的,否则后面的无法完成. 这就像我们的js代码会从上往下 运行 . 异步 :简单的说就是两个线程,你做你的,

EventEmitter事件处理器中的this问题

JavaScript中的this是一个比较绕的问题,有非常非常多的文章在讲这件事,这里推荐一篇文章,看了这篇文章基本上就能弄明白了. 这篇文章讲了关于this的一个基本原则: 包含this的Function是当作方法调用的,还是当作函数调用? 如果是obj.func()这一类型的,那么就是方法调用,如果是func()这一类型的那么就是函数调用,在方法调用中,this就是obj本身的引用,如果是函数调用,情况就复杂了, 1. 浏览器内 1.1 严格模式下:undefined 1.2 非严格模式下:

Node.js EventEmitter

Node.js EventEmitter Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列. Node.js里面的许多对象都会分发事件:一个net.Server对象会在每次有新连接时分发一个事件, 一个fs.readStream对象会在文件被打开的时候发出一个事件. 所有这些产生事件的对象都是 events.EventEmitter 的实例. EventEmitter 类 events 模块只提供了一个对象: events.EventEmitter.EventEmitt

Nodejs学习笔记01【EventEmitter】

当需要对指定事件绑定事件处理函数时,可以使用EventEmitter类的addListener方法. 而on方法仅仅是addListener原型继承的简写 常用的方法有以下几个: 1 addListener 2 on 3 removeListener 4 removeAllListener 5 emit 6 listeners 7 listenerCount

Node.js 教程 05 - EventEmitter(事件监听/发射器 )

目录: 前言 Node.js事件驱动介绍 Node.js事件 注册并发射自定义Node.js事件 EventEmitter介绍 EventEmitter常用的API error事件 继承EventEmitter 前言: 今天事儿太多了,没有发太多的东西.不好意思了各位. 本篇主要介绍Node.js中的事件驱动,至于Node.js事件概念的东西,太多了. 本系列课程主要抱着的理念就是,让大家慢慢的入门,我也尽量写的简单一点. 所以呢,本文事件驱动,大家的目标应该是:理解Node.js的事件驱动.会

eventEmitter学习

// 引入 events 模块 var events = require('events'); // 创建 eventEmitter 对象 var eventEmitter = new events.EventEmitter(); var sum = 1; var sum2 = 1; // 创建事件处理程序 var connectHandler = function connected() { console.log('连接成功.'); for(var i = 2 ; i < 100 ; i++

node概念笔记之eventemitter

1.产生事件分发的对象都是eventemitter的实例 2.events模块只提供一个对象events.EventEmitter,核心就是事件触发和事件监听功能的封装 引入方式 //引入events模块 var events = require('events'); //创建eventEmitter对象 var eventEmitter = new events.EventEmitter(); EventEmitter对象如果在实例化时发生错误,会触发error事件,当添加新的监听器时newL

nodejs 事件EventEmitter

index.js: // 引入 events 模块 var events = require('events'); //处理函数要写在调用前 var eventHandler = function(){ console.log("事件1"); }; //创建事件 var eventEmitter = new events.EventEmitter(); //事件监听 eventEmitter.on('eventName', eventHandler); //事件监听,匿名函数 even