你的位置:首页 > Java教程

[Java教程]nodejs事件的监听与事件的触发


nodejs事件(Events)

 

一、事件机制的实现

  Node.js中大部分的模块,都继承自Event模块(http://nodejs.org/docs/latest/api/events.html )。Event模块(events.EventEmitter)是一个简单的事件监听器模式的实现。具有addListener/on,once,removeListener,removeAllListeners,emit等基本的事件监听模式的方法实现。它与前端DOM树上的事件并不相同,因为它不存在冒泡,逐层捕获等属于DOM的事件行为,也没有preventDefault()、stopPropagation()、 stopImmediatePropagation() 等处理事件传递的方法。

   从另一个角度来看,事件侦听器模式也是一种事件钩子(hook)的机制,利用事件钩子导出内部数据或状态给外部调用者。Node.js中的很多对象,大多具有黑盒的特点,功能点较少,如果不通过事件钩子的形式,对象运行期间的中间值或内部状态,是我们无法获取到的。这种通过事件钩子的方式,可以使编程者不用关注组件是如何启动和执行的,只需关注在需要的事件点上即可。

二、事件触发

  events 模块只提供了一个对象: events.EventEmitter。EventEmitter的核心就是事件发射与事件监听器功能的封装。EventEmitter的每个事件由一个事件名和若干个参数组成,事件名是一个字符串,通常表达一定的语义。对于每个事件,EventEmitter支持若干个事件监听器。当事件发射时,注册到这个事件的事件监听器被依次调用,事件参数作为回调函数参数传递。

  让我们以下面的例子解释这个过程:

//引入事件模块
var events = require("events");//创建事件监听的一个对象var emitter = new events.EventEmitter();//监听事件some_eventemitter.addListener("some_event",function(){ console.log("事件触发,调用此回调函数");});//触发事件some_eventemitter.emit("some_event");

 运行结果:事件触发,调用此回调函数

 例子:

var events = require('events');var emitter = new events.EventEmitter();emitter.on('someEvent', function(arg1, arg2) {console.log('listener1', arg1, arg2);});emitter.on('someEvent', function(arg1, arg2) {console.log('listener2', arg1, arg2);});emitter.emit('someEvent', 'byvoid', 1991);

  运行的结果是:

  listener1 byvoid 1991

      listener2 byvoid 1991

  以上例子中,emitter 为事件 someEvent 注册了两个事件监听器,然后发射了someEvent事件。运行结果中可以看到两个事件监听器回调函数被先后调用。这就是EventEmitter最简单的用法。接下来我们介绍一下EventEmitter常用的API。
   EventEmitter.on(event, listener) 为指定事件注册一个监听器,接受一个字符串 event 和一个回调函数listener。EventEmitter.emit(event, [arg1], [arg2], [...]) 发射 event事件,传递若干可选参数到事件监听器的参数表。
  EventEmitter.once(event, listener) 为指定事件注册一个单次监听器,即监听器最多只会触发一次,触发后立刻解除该监听器。
   EventEmitter.removeListener(event, listener) 移除指定事件的某个监听器,listener 必须是该事件已经注册过的监听器。
   EventEmitter.removeAllListeners([event]) 移除所有事件的所有监听器,如果指定 event,则移除指定事件的所有监听器。
  更详细的 API 文档参见 http://nodejs.org/api/events.html。

 想想其实跟jquery自定义事件很相似:

//给element绑定hello事件element.on("hello",function(){ alert("hello world!");});//触发hello事件element.trigger("hello");

三、事件机制的进阶应用

  继承event.EventEmitter

  实现一个继承了EventEmitter类是十分简单的,以下是Node.js中流对象继承EventEmitter的例子:

var util = require("util");var events = require("events");//创建构造事件对象的构造函数function Stream(){  events.EventEmitter.call(this);}util.inherits(Stream, events.EventEmitter);//实例创建事件监听的一个对象var elem = new Stream();//监听事件elem.addListener("one_event",function(){  console.log("事件触发,调用此回调函数");});//触发事件some_eventelem.emit("one_event");

 

 参考资料:

  http://www.infoq.com/cn/articles/tyq-nodejs-event/

  http://www.toolmao.com/nodejs-zhongwen-events-shijian

  http://www.ynpxrz.com/n691854c2023.aspx

  http://www.jb51.net/article/61079.htm

  



去四川旅游要多少钱去四川旅游最佳路线去四川旅游最佳时间四川旅游线路报价四川旅游攻略大全2015广州番禺美食节有哪些特色美食呢?怎么去? 德庆盘龙峡有薰衣草吗?五一德庆盘龙峡薰衣草开得多吗? 五一北京周边游去哪玩好? 肇庆薰衣草五一能开吗?五一肇庆薰衣草有的看吗? 大云雾山简介?云浮大云雾山介绍? 行摄海南 被上天偏爱的万宁港北 亚洲论坛永久会址好玩吗?博鳌亚洲论坛永久会址怎么样? 大云雾山门票价格?云浮大云雾山门票多少钱? 中山逍遥谷森林公园简介?中山市五桂山逍遥谷介绍? 中山逍遥谷度假村门票多少钱?中山逍遥谷森林公园门票价格? 中山逍遥谷度假村地址?中山逍遥谷森林公园在哪里? 中山逍遥谷度假村门票价格?中山市五桂山逍遥谷门票多少钱? 马尔代夫最佳旅游时间是什么时候? 泰国幻多奇乐园在哪里?幻多奇乐园旅游 去马尔代夫旅游需要什么手续? 泰国消费水平怎么样? IDT71V3558S200BG8 Datasheet IDT71V3558S200BG8 Datasheet IDT72V3640L6PF8 Datasheet IDT72V3640L6PF8 Datasheet IDT5V551DCI Datasheet IDT5V551DCI Datasheet 四平跟团香港三天两晚游 四平跟团香港三天两晚游 四平跟团香港三天两晚游 内蒙古去香港2天旅游 内蒙古去香港2天旅游 内蒙古去香港2天旅游 牡丹江香港三天游 牡丹江香港三天游 牡丹江香港三天游