概要:本篇博客主要介绍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. 数据结构之Heap (Java)

    Heap简介 Heap译为“堆”,是一种特殊的树形数据结构,它满足所有堆的特性:父节点的值大于等于子节点的值(max heap),或者小于等于子节点的值(min heap).对于max heap 根节 ...

  2. 最强DE 战斗力 (nyoj 541)

    题解链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=541 几天前百度题解后用数学知识AC的,后来大牛说这是一道动态规划题. 网上的数学解题链接 ...

  3. Intellj idea 安装JUnit

    1.file-Settings-Plugins-Browse repositories-HTTP Proxy Settings将No proxy改成Auto-detect proxy settings ...

  4. FileOutputStream flush()

    FileOutputStream 继承 OutputStream ,flush方法查看源码方法体为空,所以flush没起到清除缓存的作用 改用BufferedOutputStream再调用flush( ...

  5. 在ubuntu14.04上安装openstack mitaka

    最近在工作环境安装部署了juno版本,在GE口测试网络性能不太满意,发现mitaka版本支持ovs-dpdk,于是抽时间安装实验一番. 参考官网的安装文档,先准备将mitaka版本安装好再配置ovs. ...

  6. Chapter 2 Open Book——38

    I looked around me to make sure it was clear. 我看了我周围一圈确定都是干净的. 我看看四周,以确认前后没有来车. That's when I notice ...

  7. 递归——CPS(二)

    给出一个计算树深度的函数: function treeDepth(curtree) { if(curtree == null) return 0; else { var leftDepth = tre ...

  8. Android记住密码自动登录的实现

    我采用的是SharedPreferences来存取数据的,所以先简单的介绍一下SharedPreferences SharedPreferences是Android平台上一个轻量级的存储类,主要是保存 ...

  9. 查询--游标 limit skip sort

    打印出所有的里程: var cursor = db.tblDaily.find(); cursor.forEach(function(x){ print(x.DailyCount + x.DailyU ...

  10. 四步安装typecho(LNMP环境)

    ##1 安装nginx,mysql,php环境 sudo apt-get install nginx php5-fpm php5-cgi php5-cli php5-curl php5-gd php5 ...