Node中EventEmitter以及如何实现JavaScript中的订阅/发布模式
2016-08-13 13:40
886 查看
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
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
相关文章推荐
- 用 JavaScript 实现发布/订阅模式
- JavaScript简单实现发布订阅模式
- ArcGIS API for JavaScript开发环境搭建与发布以及基本功能实现
- 理解javascript的设计模式之发布订阅模式
- springboot入门--springboot集成redis实现消息发布订阅模式
- 实现一个简单的订阅与发布模式的代码块,和redux
- js设计模式之代理模式以及订阅发布模式
- ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现
- 项目开发中的一些注意事项以及技巧总结 基于Repository模式设计项目架构—你可以参考的项目架构设计 Asp.Net Core中使用RSA加密 EF Core中的多对多映射如何实现? asp.net core下的如何给网站做安全设置 获取服务端https证书 Js异常捕获
- JavaScript设计模式之观察者模式(发布订阅模式)原理与实现方法示例
- JavaScript事件发布/订阅模式原理与用法分析
- redis实现消息队列&发布/订阅模式使用
- JavaScript2种构造函数创建对象的模式以及继承的实现
- 自实现观察者模式(发布/订阅模式)的一个隐藏bug
- Spring Boot 与Redis 集成实现消息发布/订阅模式
- JavaScript之发布-订阅模式
- 模式匹配算法以及KMP的javascript实现
- node.js 发布订阅模式
- node.js 发布订阅模式的实例