node.js如何自定义实现一个EventEmitter


Posted in Javascript onJuly 16, 2021

前言

最近做了商品批发的需求,需要针对不同的商户选择对应的批发商品回显到原来的界面。由于该项目的代码是公司古董级别(这种代码都是程序猿的痛),解决问题的时候都是小心翼翼的。为了避免这种问题减少外部依赖,手动封装事件派发的函数。

一、是什么

我们了解到,Node采用了事件驱动机制,而EventEmitter就是Node实现事件驱动的基础
在EventEmitter的基础上,Node几乎所有的模块都继承了这个类,这些模块拥有了自己的事件,可以绑定/触发监听器,实现了异步操作
Node.js 里面的许多对象都会分发事件,比如 fs.readStream 对象会在文件被打开的时候触发一个事件
这些产生事件的对象都是 events.EventEmitter 的实例,这些对象有一个 eventEmitter.on() 函数,用于将一个或多个函数绑定到命名事件上

二、nodejs中EventEmitter使用方法

Node的events模块只提供了一个EventEmitter类,这个类实现了Node异步事件驱动架构的基本模式——观察者模式
在这种模式中,被观察者(主体)维护着一组其他对象派来(注册)的观察者,有新的对象对主体感兴趣就注册观察者,不感兴趣就取消订阅,主体有更新的话就依次通知观察者们

const EventEmitter = require('events')
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter()
function callback() {
    console.log('触发了event事件!')
}
myEmitter.on('event', callback)
myEmitter.emit('event')
myEmitter.removeListener('event', callback);

三、实现过程

基本代码如下所示:

//事件派发机制
(function() {
    var EventDispatcher = function() {
        var EventDispatcherClosure = function() {

        };
        EventDispatcherClosure.prototype = {
            /**
             * 注册事件
             * @param {Object} key
             * @param {Object} fn
             */
            on: function(key, fn) {
                //获取当前的事件对象
                var curEvents = this._getCurEvents(key);
                //先检查该事件是否已经注册过了
                var flag = false;
                for (var i = 0, len = curEvents.length; i < len; i++) {
                    if (curEvents[i].name == fn.name) {
                        //已经出现过了,以最新注册的函数为主
                        flag = true;
                        curEvents[i] = fn;
                        break;
                    }
                }
                if (!flag) {
                    curEvents[curEvents.length] = fn;
                }
                this._register(key, curEvents);
            },
            /**
             * 派发事件
             * @param {Object} key
             * @param {Object} data
             */
            dispatch: function(key) {
                //获取当前的事件对象
                var curEvents = this._getCurEvents(key);
                var shouldDispatch = true;
                for (var i = 0, len = curEvents.length; shouldDispatch && i < len; i++) {
                    try {
                        //获取参数
                        var args = [];
                        for (var j = 1, len1 = arguments.length; j < len1; j++) {
                            args.push(arguments[j]);
                        }
                        shouldDispatch = curEvents[i].apply({}, args);
                    } catch (e) {
                        shouldDispatch = false;
                    }
                }
                return shouldDispatch;
            },
            remove: function(key) {
                if (this._getCurEvents(key)) {
                    delete EventDispatcherClosure.events[key];
                }
            },
            /**
             * 根据key获取事件列表
             * @param {Object} key
             */
            _getCurEvents: function(key) {
                return EventDispatcherClosure.events[key] || [];
            },
            /**
             * 注册时间
             * @param {Object} key
             * @param {Object} events
             */
            _register: function(key, events) {
                EventDispatcherClosure.events[key] = events;
            },
        };
        EventDispatcherClosure.events = {};
        return {
            create: function() {
                return new EventDispatcherClosure();
            }
        };
    };
    window.EventDispatcher = new EventDispatcher().create();
})();

首先定义一个全局变量的匿名函数,然后将全局变量挂在window上面,这样可以让我们在开发过程中的调用。在匿名函数的原型链上面添加事件分发、事件监听、事件删除等方法。

事件分发的调用

EventDispatcher.dispatch("test", obj)

事件监听

EventDispatcher.on("test", function callback(obj) {
})

事件删除

EventDispatcher.on("test")

代码封装的比较简单

到此这篇关于node.js如何自定义实现一个EventEmitter的文章就介绍到这了,更多相关node实现EventEmitter内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
一种JavaScript的设计模式
Nov 22 Javascript
WordPress 插件——CoolCode使用方法与下载
Jul 02 Javascript
Jquery知识点三 jquery表单对象操作
Jan 17 Javascript
JavaScript中的常见问题解决方法(乱码,IE缓存,代理)
Nov 28 Javascript
Javascript快速排序算法详解
Dec 03 Javascript
node模块机制与异步处理详解
Mar 13 Javascript
JavaScript记录光标在编辑器中位置的实现方法
Apr 22 Javascript
基于JS实现的笛卡尔乘积之商品发布
May 13 Javascript
JavaScript数据结构之二叉查找树的定义与表示方法
Apr 12 Javascript
js原生方法被覆盖,从新赋值原生的方法
Jan 02 Javascript
vue+jquery+lodash实现滑动时顶部悬浮固定效果
Apr 28 jQuery
vue axios封装及API统一管理的方法
Apr 18 Javascript
node.js使用express-fileupload中间件实现文件上传
Jul 16 #Javascript
html5 录制mp3音频支持采样率和比特率设置
js基础语法与maven项目配置教程案例
JavaScript与JQuery框架基础入门教程
Jul 15 #Javascript
Python机器学习之决策树和随机森林
微信小程序scroll-view不能左右滑动问题的解决方法
Vue Element-ui表单校验规则实现
Jul 09 #Vue.js
You might like
php桌面中心(三) 修改数据库
2007/03/11 PHP
php 调用远程url的六种方法小结
2009/11/02 PHP
学习PHP的数组总结【经验】
2016/05/05 PHP
动态控制Table的js代码
2007/03/07 Javascript
Extjs学习笔记之五 一个小细节renderTo和applyTo的区别
2010/01/07 Javascript
JavaScript DOM 学习第七章 表单的扩展
2010/02/19 Javascript
13 个JavaScript 性能提升技巧分享
2012/07/26 Javascript
基于jQuery的动态增删改查表格信息,可左键/右键提示(原创自Zjmainstay)
2012/07/31 Javascript
封装html的select标签的js操作实例
2013/07/02 Javascript
JS获取图片高度宽度的方法分享
2015/04/17 Javascript
JavaScript中继承用法实例分析
2015/05/16 Javascript
jquery实现带缩略图的全屏图片画廊效果实例
2015/06/25 Javascript
iPhone手机上搭建nodejs服务器步骤方法
2015/07/06 NodeJs
JavaScript中的Repaint和Reflow用法详解
2015/07/27 Javascript
js实现密码强度检测【附示例】
2016/03/30 Javascript
ES6中Array.includes()函数的用法
2017/09/20 Javascript
javascript trie前缀树的示例
2018/01/29 Javascript
vue2.0实现移动端的输入框实时检索更新列表功能
2018/05/08 Javascript
Postman的下载及安装教程详解
2018/10/16 Javascript
express express-session的使用小结
2018/12/12 Javascript
JS寄快递地址智能解析的实现代码
2020/07/16 Javascript
Python实现拷贝多个文件到同一目录的方法
2016/09/19 Python
对python中的float除法和整除法的实例详解
2019/07/20 Python
用python解压分析jar包实例
2020/01/16 Python
使用python处理题库表格并转化为word形式的实现
2020/04/14 Python
Python过滤掉numpy.array中非nan数据实例
2020/06/08 Python
keras的load_model实现加载含有参数的自定义模型
2020/06/22 Python
Python异常处理机制结构实例解析
2020/07/23 Python
简述 Python 的类和对象
2020/08/21 Python
ASOS英国官网:英国在线时装和化妆品零售商
2017/05/19 全球购物
荷兰演唱会和体育比赛订票网站:viagogo荷兰
2018/04/08 全球购物
前台领班岗位职责
2013/12/04 职场文书
商标侵权律师函
2015/05/27 职场文书
三八节活动简报
2015/07/20 职场文书
Python代码风格与编程习惯重要吗?
2021/06/03 Python
JavaScript实例 ODO List分析
2022/01/22 Javascript