起因:回调函数模式让 Node 可以处理异步操作。但是,为了适应回调函数,异步操作只能有两个状态:开始和结束。对于那些多状态的异步操作(状态1,状态2,状态3,……),回调函数就会无法处理,你不得不将异步操作拆开,分成多个阶段。每个阶段结束时,调用下一个回调函数。
解决:为了解决这个问题,Node 提供 Event Emitter 接口。通过事件,解决多状态异步操作的响应问题。
这个接口由events模块提供。
events模块的EventEmitter是一个构造函数,可以用来生成事件发生器的实例emitter。
然后,事件发生器的实例方法on用来监听事件,实例方法emit用来发出事件。
emitter.on(name, f) 对事件name指定监听函数f
emitter.addListener(name, f) addListener是on方法的别名
emitter.once(name, f) 与on方法类似,但是监听函数f是一次性的,使用后自动移除
emitter.listeners(name) 返回一个数组,成员是事件name所有监听函数
emitter.removeListener(name, f) 移除事件name的监听函数f
emitter.removeAllListeners(name) 移除事件name的所有监听函数
Node默认允许同一个事件最多可以指定10个回调函数。超过10个回调函数,会发出一个警告。这个门槛值可以通过setMaxListeners方法改变。
事件处理过程中抛出的错误,可以使用try...catch捕获。
如果不使用try...catch,可以让进程监听uncaughtException事件。
Events模块默认支持两个事件。
newListener事件:添加新的回调函数时触发。
removeListener事件:移除回调时触发。
http://javascript.ruanyifeng.com/nodejs/events.html