Node中EventEmitter以及如何实现JavaScript中的订阅/发布模式

1.EventEmitter

Node中很多模块都能够使用EventEmitter,有了EventEmitter才能方便的进行事件的监听。下面看一下Node.js中的EventEmitter如何使用。

(1)基本使用

EventEmitter是对事件触发和事件监听功能的封装,在node.js中的event模块中,event模块只有一个对象就是EventEmitter,下面是一个最基本的使用方法:

var EventEmitter = require(‘events‘).EventEmitter;
var event = new EventEmitter();
event.on(‘some_event‘, function() {
    console.log(‘some_event 事件触发‘);
});
setTimeout(function() {
    event.emit(‘some_event‘);
}, 1000); 

上面的代码中首先实例化了一个EventEimitter对象,然后就可以进行事件的监听以及发布。通过on方法对特定的事件进行监听,通过emit方法对事件进行发布。在1s后发布一个"some_event"事件,这个时候就会自动被event对象通过on进行监听,并触发对应的回调方法。

(2)EventEmitter支持的方法

EventEmitter实例对象支持的方法列表如下:

emitter.on(name, f) //对事件name指定监听函数f

emitter.once(name, f) //与on方法类似,但是监听函数f是一次性的,使用后自动移除

emitter.listeners(name) //返回一个数组,成员是事件name所有监听函数

emitter.removeListener(name, f) //移除事件name的监听函数f

emitter.removeAllListeners(name) //移除事件name的所有监听函数

同时,事件的发布emit方法可以传入多个参数,第一个参数是定义的事件,后面其他参数回作为参数传递到监听器的回调函数中。示例如下:

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‘, ‘arg1 参数‘, ‘arg2 参数‘); 

2.原生JavaScript实现事件的订阅/发布模式

上面的EventEmitter就是事件订阅/发布模式的实现,下面我们使用原生的JavaScript进行实现:

var EventEmitter = {
	topics: {},
	on: function(topic, listener){   //订阅事件
		if (!this.topics[topic]) {
			this.topics[topic] = [];
		}
  		//将监听函数push到对应的数组位置,即topic事件对应listener方法
		this.topics[topic].push(listener);
	},
	emit: function(topic, data){  //第一个参数是事件名,第二个参数是传入监听器回调方法内的参数
		if (!this.topics[topic] || this.topics[topic].length < 1) {
			return;
		}
  		//对topic事件的每个监听函数,执行listener方法
		this.topics[topic].forEach(function(listener){
			listener(data || {});
		});
	}
};

我们可以使用上面自己定义的EventEmitter类了,比如:

EventEmitter.on("myevent", function(a){

console.log(a);    //控制台打印出Hi

});

EventEmitter.emit("myevent", "Hi");   //发布事件后,控制台打印出Hi

时间: 2024-10-16 03:29:01

Node中EventEmitter以及如何实现JavaScript中的订阅/发布模式的相关文章

项目中发现的一些关于JavaScript中JSON的注意点

一个是怎样创建JSON: var obj = {}; obj['name'] = value; obj['anotherName'] = anotherValue; 假设要创建多级的JSON,则: ips[ipId] = {}; ips[ipId]['name'] = value; ips[ipId]['anotherName'] = anotherValue; 注意要用bracket[]而不能用点. 来訪问json object bracket尽管写起来麻烦一些,可是能够避免非常多错误! ht

IOS5中的Safari不兼容Javascript中的Date问题

在IOS5以上版本(不包含IOS5)中的Safari浏览器能正确解释出Javascript中的 new Date('2016-06-07') 的日期对象. 但是在IOS5版本里面的Safari解释new Date('2016-06-07') 不正确,在IOS5的Safari中返回的永远是"Invalid Date". 想要IOS5中的Safari能正确解析new Date()那么必须这么写 new Date('2016/06/07');

JavaScript设计模式 - 订阅发布模式(观察者模式)

var Event = (function() { var global = this, Event, _default = 'default'; Event = function() { var _create, _listen, _trigger, _remove, _shift = Array.prototype.shift, _unshift = Array.prototype.unshift, namespaceCache = {}, each = function(ary, fn)

图说js中的this——深入理解javascript中this指针

没搞错吧!js写了那么多年,this还是会搞错!没搞错,javascript就是回搞错! ………… 文章来源自——周陆军的个人网站:http://zhoulujun.cn/zhoulujun/html/webfront/ECMAScript/jsBase/2016_0329_7729.html 在写java的时候,this用错了,idea都会直接报错! 比如…… 但是,js,……idea,爱莫能助了…… 在面向对象编程里有两个重要的概念:一个是类,一个是实例化的对象,类是一个抽象的概念,用个形象

jquery中的$(document).ready()、JavaScript中的window.onload()以及body中的onload()的区别

  body中的onload()和window.onload以及$(document).ready()的区别: 1.前两者都表示当页面加载元素(包括图片等信息)完毕后执行的操作,而且两者在各种浏览器中都兼容,而$(document).ready()表示的是JQuery中的一个方法因而只有在支持jQuery的浏览器中才适用,同时该方法是在当页面的dom节点加载完毕后就执行,无需等待页面中的图片等加载完成. 2.当代码中同时存在body中的onload()和window.onload()要注意的 :

JavaScript中DOM的层次节点(一)

DOM是针对HTML和XML文档的一个API,描绘了一个层次化的节点树,允许开发人员添加.修改.删除节点的一部分. DOM将HTML和XML文档描绘成一个有多个节点构成的结构,节点分为12种不同的节点类型,每种都拥有自己的特点.数据和方法,并且和其他节点存在着某种关系. html元素称为文档元素,所有的元素都包含在文档元素中,并且每个文档只有一个html元素. 1 Node类型 DOM1级定义了Node接口,该接口由DOM中的所有节点类型实现.这个接口在JavaScript中是作为Node类型实

javascript中12种DOM节点类型概述

× 目录 [1]元素 [2]特性 [3]文本[4]CDATA[5]实体引用[6]实体名称[7]处理指令[8]注释[9]文档[10]文档类型[11]文档片段[12]DTD 前面的话 DOM是javascript操作网页的接口,全称为文档对象模型(Document Object Model).它的作用是将网页转为一个javascript对象,从而可以使用javascript对网页进行各种操作(比如增删内容).浏览器会根据DOM模型,将HTML文档解析成一系列的节点,再由这些节点组成一个树状结构.DO

JavaScript中的两个“0”(翻译)

本文翻译自JavaScript’s two zeros JavaScript has two zeros: −0 and +0. This post explains why that is and where it matters in practice. JavaScript 中有两个“0”: -0 和 +0 .这篇文章解释了为什么,并且指出实际生产中会造成什么影响 1.The signed zero 1.“-0” Numbers always need to be encoded to b

理解JavaScript中的作用域和上下文

JavaScript对于作用域(Scope)和上下文(Context)的实现是这门语言的一个非常独到的地方,部分归功于其独特的灵活性. 函数可以接收不同的的上下文和作用域.这些概念为JavaScript中的很多强大的设计模式提供了坚实的基础. 然而这也概念也非常容易给开发人员带来困惑.为此,本文将全面的剖析这些概念,并阐述不同的设计模式是如何利用它们的. Statement 作者: 景庄,Web开发者,主要关注JavaScript.Node.js.React.Docker等. 原文地址: htt