Nodejs是基于V8引擎实现的事件驱动IO。事件模块Events是Nodejs的核心模块之一,许多模块都继承自Event模块,因此也能够发射事件。例如,http模块创建HTTP服务器时,会发射"connect"事件,断链接时会发射“ close”事件。这些对象在Node中被称为:事件发射击器。需要处理这些事件的对象可以订阅事件,并将回调函数绑定到这些事件上。事件发射器发射事件时,对应的回调函数就会被调用。
Nodejs中,自定义一个事件发射非常简单,实现一个继承自event.EventEmitter的伪类。
EventEmitter与回调函数密不可分,而回调函数就是后继传递风格的一种体现。后继传递风格是一种控制流通过参数传递的风格。简单的说就是把后继,也就是下一步要运行的代码,封装成函数,通过参数传递的方式传给当前运行的函数。
事件发射器模式的优点是:函数运行中发送多个时间时,使用时间监听的模式更容易handle。
监听事件中有一个特例"error",即使不监听error,当error事件发生时,事件发射器会注意到它,并向上抛一个未捕获的异常。
应用事件发生器API:(1)emitter.once(event, listener)添加一个一次性监听器,这个监听器只会在下一次事件发生时被触发一次,触发完成后就被删除。(2) emitter.addListener(event, listener)添加一个监听器至特定事件的监听器数组尾部,和 on 方法一样。(3) emitter.removeListener(event, listener)从一个事件的监听器数组中删除一个监听器,注意:此操作会改变监听 数组中当前监听器后的所有监听器在的下标。(4)emitter.removeAllListener(event, listener)删除所有监听器。
注意:事件发射器模式允许多个事件监听器监听同一事件发射器的同一类型的事件,但是如果前面的抛出异常,后面的监听器将不会被调用。
上面的代码重新定义了once,获取事件后,取消回调函数的注册方法,同事调用原来的回调函数。
事件发射器的使用:
(1)实现一个事件发生器
Nodejs中,自定义一个事件发射非常简单,实现一个继承自event.EventEmitter的伪类。inherits是util模块中方法用于复制父对象中的方法。代码中util.inherits就是建立了一条原型链,使MyClass类具有了EventEmitter类的原型方法。示例如下:
(2)发射及监听事件
继承EventEmitter类后,MyClass类的实例就可以发射事件了,添加一个事件发射器:
当MyClass类的实例调用sendEvent方法时,就会发送一个myEvent的事件。事件被发射的同时,还可以同时发送一些数据,上面示例中的:'arg 1'和'arg 2'就是被发送的数据。事件被发射时,两个字符串会做为参数发送给事件监听器。下面实例化MyClass类,并在类实例中创建事件监听,及发送事件:
网友评论