EventEmitter
基本构建
许多的node.js 核心的 API 是围绕事件异步模型进行构建的,特定种类的事件对象会周期性的触发命名的函数对象,从而导致函数对象被触发。 这些函数对象被称作 listeners;所有的触发事件的对象属于 EventEmitter 类, 这些对象暴露有 emit 以及 on 方法。1 | let eventEmitter = require('events'); |
向 lisitens 传递 arguments 以及 this 值
1 | myEmitter.on('event', function (msg) { |
handle event only once
使用once 函数的时候, 当使用 emit 的时候只会被触发一次1 | myEmitter.once('event', () => { |
some API
Event: newListener
在监听器被加入到监听器队列之前,EventEmitter 实例会触发自己的 newListener 事件。1 | const myEmitter = new EventEmitter(); |
EventEmitter.listenerCount(emitter, eventName)
用来获得在 emitter 上面注册的 eventName 的次数。1 | let myEmitter = new EventEmitter(); |
emitter.eventNames()
用来获得 emitter 上面注册的 listeners 的事件列表。 1 | let myEmitter = new EventEmitter(); |
emitter.listenerCount(eventName)
eventName : the name of the event being listened for作用和 EventEmitter.listenerCount(emitter, eventName) 是相同的。 emitter.listeners(eventName)
用于获得 emitter 上 eventName 事件的注册函数。1 | let myEmitter = new EventEmitter(); |
emitter.on(eventName, listener)
向一个被称作 eventName 的事件listener 的列表之中添加事件, 添加的事件被添加到 listener 列表的末尾。 注意,在添加事件的时候, 添加的事件只会按照顺序添加到时间列表数组的末尾,在这个过程中,不会进行判断事件是否已经添加了。emitter.prependListener(eventName, listener)
将 listener function 添加到事件队列的开头1 |
|
emitter.prependOnceListener(eventName, listener)
仅仅添加一次运行的函数到事件队列开始,第二次调用的时候会被移除emitter.removeAllListeners([eventName])
移除 eventName 事件上的所有函数。 emitter.removeListener(eventName, listener)
removes the specified listener from the listener array for the event named eventName使用
removeListener 的时候将会移除事件队列中至多一个instance (实例), 如果一个 单独的监听器被多次添加,那么使用 removeListener 需要多次调用才能被多次删除。 从被称作 eventName 的事件队列中移除掉特定的事件函数。注意:一旦时间被触发的时候, 在触发的时刻所有与之相关联的也就是说, 使用使用移除事件的时候是不会在listeners将会被调用, 这表明, 在listeners被emit之后,在listeners中的最后一个函数被执行之前, 使用removeListenr()或者removeAllListeners都不会起作用
listeners 函数执行的过程中被调用的。 例子如下:1 | const callBackA = () => { |
listeners 而言, 是通过使用内部的数组进行管理的, 当其中的 listener 被移除之后,会改变每一个注册的 listern 位置, 但是不会影响 listener 被调用的顺序, 但是通过使用 emitter.listeners() 返回的调用函数数组队列将会发生变化。