node.JS事件机制与events事件模块的使用方法详解

node.JS事件机制说明

多数 Node.js 核心 API 都是采用惯用的异步事件驱动架构,其中某些类型的对象(称为触发器)会周期性地触发命名事件来调用函数对象(监听器)。例如,一个net.Server对象会在每次有新连接时触发一个事件;一个 fs.ReadStream 会在文件被打开时触发一个事件;一个 stream会在数据可读时触发事件。

EventEmitter

EventEmitter 类由 events 模块定义和开放的,所有能触发事件的对象都是 EventEmitter 类的实例

var EventEmitter = require('events'); /* { [Function: EventEmitter] EventEmitter: [Circular], usingDomains: false, defaultMaxListeners: [Getter/Setter], init: [Function], listenerCount: [Function] } */ console.log(EventEmitter);

events模块的EventEmitter属性指向该模块本身

var events = require('events'); console.log(events.EventEmitter === events);//true EventEmitter是一个构造函数,可以用来生成事件发生器的实例emitter var EventEmitter = require('events'); var emitter = new EventEmitter(); /* EventEmitter { domain: null, _events: {}, _eventsCount: 0, _maxListeners: undefined } */ console.log(emitter);

方法 emitter.emit(eventName[, ...args])

eventName <any>

...args <any>

该方法按监听器的注册顺序,同步地调用每个注册到名为eventName事件的监听器,并传入提供的参数。如果事件有监听器,则返回true,否则返回false

var EventEmitter = require('events'); var emitter = new EventEmitter(); emitter.on('test1',function(){}); console.log(emitter.emit('test1'));//true console.log(emitter.emit('test2'));//false

emitter.on(eventName, listener)

该方法用于添加listener函数到名为eventName的事件的监听器数组的末尾

eventName <any> 事件名

listener <Function> 回调函数

[注意]不会检查listener是否已被添加。多次调用并传入相同的eventName和listener会导致listener被添加与调用多次

var EventEmitter = require('events'); var emitter = new EventEmitter(); emitter.on('test',function(){ console.log(1); }); emitter.on('test',function(){ console.log(2); }); emitter.emit('test');//1 2

该方法返回一个 EventEmitter 引用,可以链式调用

var EventEmitter = require('events'); var emitter = new EventEmitter(); emitter.on('test',function(){ console.log(1); }).on('test',function(){ console.log(2); }); emitter.emit('test');//1 2

emitter.addListener(eventName, listener)

emitter.on(eventName, listener) 的别名

var EventEmitter = require('events'); var emitter = new EventEmitter(); emitter.addListener('test',function(){ console.log(1); }); emitter.emit('test');//1

emitter.prependListener()

与on()方法不同,prependListener()方法可用于将事件监听器添加到监听器数组的开头

var EventEmitter = require('events'); var emitter = new EventEmitter(); emitter.on('test',function(){ console.log(1); }).prependListener('test',function(){ console.log(2); }); emitter.emit('test');//2 1

emitter.once(eventName, listener)

该方法添加一个单次 listener 函数到名为 eventName 的事件。 下次触发 eventName 事件时,监听器会被移除,然后调用

eventName <any> 事件名

listener <Function> 回调函数

var EventEmitter = require('events'); var emitter = new EventEmitter(); emitter.on('test',function(){ console.log(1); }).once('test',function(){ console.log(2); }); emitter.emit('test');//1 2 emitter.emit('test');//1

emitter.prependOnceListener()

该方法用于将事件监听器添加到监听器数组开头。下次触发eventName事件时,监听器会被移除,然后调用

var EventEmitter = require('events'); var emitter = new EventEmitter(); emitter.on('test',function(){ console.log(1); }).prependOnceListener('test',function(){ console.log(2); }); emitter.emit('test');//2 1 emitter.emit('test');//1

emitter.removeAllListeners([eventName])

eventName <any>

移除全部或指定 eventName 的监听器,返回一个 EventEmitter 引用,可以链式调用

[注意]在代码中移除其他地方添加的监听器是一个不好的做法,尤其是当 EventEmitter 实例是其他组件或模块(如 socket 或文件流)创建的

var EventEmitter = require('events'); var emitter = new EventEmitter(); emitter.on('test',function(){ console.log(1); }).removeAllListeners('test'); emitter.emit('test');//''

emitter.removeListener(eventName, listener)

eventName <any>

listener <Function>

从名为 eventName 的事件的监听器数组中移除指定的 listener

var EventEmitter = require('events'); var emitter = new EventEmitter(); function show(){ console.log(1); } emitter.on('test',show).removeListener('test',show); emitter.emit('test');//''

[注意]removeListener最多只会从监听器数组里移除一个监听器实例。如果任何单一的监听器被多次添加到指定eventName的监听器数组中,则必须多次调用removeListener才能移除每个实例

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/e86aae35425ece426757b3361704ba3e.html