概要:本篇博客主要介绍EventEmitter  

  Node.js所有的异步I/O操作在完成时都会发送一个事件到事件队列。事件由EventEmitter对象提供。下面通过一个例子来说明EventEmitter的用法:

var EventEmitter = require('events').EventEmitter;
var event = new EventEmitter(); event.on('some_event',function(){
console.log('some_event occured.');
}); setTimeout(function(){
event.emit('some_event');
},1000);

  运行这段代码,1秒后控制台输出了 some_event occured. 。原因是event对象注册了事件 some_event 的一个监听器,然后我们通过 setTimeout 在1000毫秒以后向event 对象发送事件 some_event,此时会调用 some_event 的监听器。

1. 事件发射器

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

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

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);

运行结果是:

  以上例子中,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,则移除指定事件的所有监听器。

2.error事件

  EventEmitter定义了一个特殊的事件error,在遇到异常时通常会发射error事件,当error被发射时,如果没有响应的监听器,Node.js会把它当作异常,退出程序并打印调用栈。我们一般会为发射器error事件的对象设置监听器,避免遇到错误后整个程序崩溃。例如:

var events = require('events');
var emitter = new events.EventEmitter(); emitter.emit('error');

运行时,会显示以下错误:

3.继承EventEmitter

  大多数时候我们不会直接使用EventEmitter,而是在对象中继承它。包括fs、net、http在内的,只要是支持事件响应的核心模块都是EventEmitter的子类。

Node.js:EventEmitter的更多相关文章

  1. Node.js:EventEmitter类

    一.EventEmitter 类 Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列. Node.js里面的许多对象都会分发事件:一个net.Server对象会在每次有新连接时 ...

  2. 从发布订阅模式入手读懂Node.js的EventEmitter源码

    前面一篇文章setTimeout和setImmediate到底谁先执行,本文让你彻底理解Event Loop详细讲解了浏览器和Node.js的异步API及其底层原理Event Loop.本文会讲一下不 ...

  3. Node.js:进程、子进程与cluster多核处理模块

    1.process对象 process对象就是处理与进程相关信息的全局对象,不需要require引用,且是EventEmitter的实例. 获取进程信息 process对象提供了很多的API来获取当前 ...

  4. Node.js:理解stream

    Stream在node.js中是一个抽象的接口,基于EventEmitter,也是一种Buffer的高级封装,用来处理流数据.流模块便是提供各种API让我们可以很简单的使用Stream. 流分为四种类 ...

  5. (译)Node.js的 EventEmitter 教程

    原文标题:Node.js EventEmitter Tutorial 原文链接:http://www.hacksparrow.com/node-js-eventemitter-tutorial.htm ...

  6. 深入理解 Node.js 中 EventEmitter源码分析(3.0.0版本)

    events模块对外提供了一个 EventEmitter 对象,即:events.EventEmitter. EventEmitter 是NodeJS的核心模块events中的类,用于对NodeJS中 ...

  7. Node.js:常用工具、路由

    一.常用工具util util 是一个Node.js 核心模块,提供常用函数的集合,用于弥补核心JavaScript 的功能 过于精简的不足. 1.util.inherits util.inherit ...

  8. Node.js:Stream(流)

    Stream 是一个抽象接口,Node 中有很多对象实现了这个接口.例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出). Node.js,Str ...

  9. Node.js:创建应用+回调函数(阻塞/非阻塞)+事件循环

    一.创建应用 如果我们使用PHP来编写后端的代码时,需要Apache 或者 Nginx 的HTTP 服务器,并配上 mod_php5 模块和php-cgi.从这个角度看,整个"接收 HTTP ...

随机推荐

  1. Url Rewrite IIS 配置

    在configuration节点下 <system.webServer> <rewrite> <rules> <rule name="rD" ...

  2. linux 学习-软件的安装

    Linux软件的安装rpm -ivh安装软件全名 -i install 安装 -v verbose 显示详细信息 -h hash 显示进度 --nodeps 不检测依赖性(不推荐使用) rpm -U ...

  3. C# FTPHelper(搬运)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.N ...

  4. linux的环境变量设置

    source/etc/profile是让/etc/profile文件修改后立即生效, 还有一种方法是:. /etc/profile 注意:.和/etc/profile有空格 linux中source命 ...

  5. android 沉浸式状态栏的实现

    本文介绍一种简单的实现沉浸式状态栏的方法,要高于或等于api19才可以. 实现android沉浸式状态栏很简单,添加代码两步就可以搞定. 一.在activity中添加 getWindow().addF ...

  6. OBIEE接受外部参数

    样例: http://192.168.0.99/analytics/saw.dll?Go&Path=/shared/goxiangyibiaopan/SBDW_GSYDL_ZZT&Ac ...

  7. fiddler还是浏览器的问题

    当我在浏览器里输入http://localhost/infomanage/price?cityid=1&cateid=246&timer=3 后端接收的参数是timer的时候,浏览器会 ...

  8. 将JSON对象转化为数组对象

    package web.helper; import java.util.ArrayList; import net.sf.json.JSONArray; import web.model.Abstr ...

  9. Canvas裁剪和Region、RegionIterator

    主要是看这边文章学习:http://blog.csdn.net/lonelyroamer/article/details/8349601 Region.op参数 DIFFERENCE(0), //最终 ...

  10. HDU 5904 LCIS

    $dp$. 这题的突破口在于要求数字是连续的. 可以分别记录两个串以某个数字为结尾的最长上升长度,然后枚举一下以哪个数字为结尾就可以得到答案了. 因为$case$有点多,不能每次$memset$,额外 ...