events称为事件触发器,on() 用于注册监听器, emit() 用于触发事件。用例如下:

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

这就是events模块的使用,在 node 中有很多模块都继承于它,比如构建一个HTTP服务时处理post请求数据。

const http = require('http');    const server = http.createServer((req, res) => {   const buffers = [];    req.on('data', function (chunk) { buffers.push(chunk);    }); req.on('end', function () {   const content = Buffer.concat(buffers).toString(); console.log(content)    });
})
server.listen(8080)

在处理 post 数据时通过 on注册了dataend事件,每当请求到来http模块内部会通过emit触发这两个事件。

现在已经掌握了events模块的使用,下面介绍其实现原理。

const EventEmitter = {    _events = {    data: () => {}, end: () => {}   },  _eventsCount: 2,
}

在 events 模块内部会维护一个依赖关系的的对象,属性_events 是保存事件名称和事件处理函数的对应关系,属性_eventsCount 是保存事件的个数。

第一步初始化依赖关系的的对象

function EventEmitter() {   EventEmitter.init.call(this);
}   EventEmitter.init = function () {  if (this._events === undefined) {    this._events = Object.create(null);    this._eventsCount = 0; }
}

第二步实现on注册事件的方法

EventEmitter.prototype.addListener = function addListener(type, listener) {   return _addListener(this, type, listener)
}   function _addListener(target, type, listener) { var events; var existing;   checkListener(listener) events = target._events;   if (events === undefined) {  events = target._events = Object.create(null);    target._eventsCount = 0;   } else {    existing = events[type]    }   if (existing === undefined) {    events[type] = listener;   ++target._eventsCount;    } else {    if (typeof existing === 'function') {  existing = events[type] = [existing, listener]    } else {    existing.push(listener) }   }   return target
}   EventEmitter.prototype.on = EventEmitter.prototype.addListener

第三步实现emit触发事件的方法

EventEmitter.prototype.emit = function emit(type, ...args) {  const events = this._events;   const handler = events[type];  if (handler === undefined) { return false    }   if (typeof handler === 'function') {   Reflect.apply(handler, this, args)  } else {    let len = handler.length;  const listeners = arrayClone(handler, len);    for (var i = 0; i < len; ++i) {   Reflect.apply(listeners[i], this, args) }   }
}   function arrayClone(arr, n) {   var copy = new Array(n);   for (var i = 0; i < n; ++i) { copy[i] = arr[i];  }   return copy;
}

现在已经基本完成了events 的核心原理,其设计思想还是发布订阅。

node中events实现原理相关推荐

  1. Node 中的 Events

    Node 中的 Events Node 中的 Events 1. 事件和监听器 2. 处理 error 事件 3. 继承 Events 模块 4. 手写 EventEmitter Node 中的 Ev ...

  2. 二十五、Node中的Buffer缓冲器和EventEmitter事件触发器

    @Author:Runsen @Date:2020/6/5 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件.导致翘课严重,专业排名 ...

  3. node 进阶 | 通过node中如何捕获异常阐述express的特点

    node如何捕获异常 node基于js的单线程,有了非阻塞异步回调的概念,但是在处理多个并发连接时,并发环境要求高,最重要的是单线程,单核CPU,一个进程crash则web服务都crash,但是为什么 ...

  4. vue指令写在html中的原理,详解Vue中的MVVM原理和实现方法

    对Vue中的MVVM原理解析和实现首先你对Vue需要有一定的了解,知道MVVM.这样才能更有助于你顺利的完成下面原理的阅读学习和编写下面由我阿巴阿巴的详细走一遍Vue中MVVM原理的实现,这篇文章大家 ...

  5. node中异步IO的理解

    解释性语言和编译型语言的区别: 计算器不能直接的理解高级语言,只能理解机器语言,所以必须把高级语言翻译为机器语言,翻译的方式有两种,一个是编译,一个是解释. 解释性语言的程序不需要编译,它是在运行程序 ...

  6. node中模板引擎、模块导出、package.json简介

    在node.js中使用引擎模板: art-template不仅在浏览器可以使用,也可以在node中使用,并且模板引擎起早诞生于服务器领域,在node中使用模板引擎: 1.安装:在一个文件目录下执行命令 ...

  7. nodejs中events模块的使用

    nodejs中events的基本使用 讲events之前我们先用js模拟实现一个EventEmitter类 源码 //订阅者集合 class EventEmitter{constructor(){th ...

  8. 春风十里不如Node中的一股清流

    一股清流 清明时节雨纷纷,果然每逢清明是会下雨的.在这个雨夹雪,不方便外出的日子,宅在家里一起来相互学习分享吧!不然还能怎样呢!哈哈 友情提示:本文可能会涉及到一些Api的内容,会很乏味,很枯燥,很没 ...

  9. Cocos2d-x中图字原理之深入分析

    [Cocos2d-x相关教程来源于红孩儿的游戏编程之路 CSDN博客地址:http://blog.csdn.net/honghaier] 红孩儿Cocos2d-X学习园地QQ群:249941957 加 ...

最新文章

  1. 5分钟 NLP系列—— 11 个词嵌入模型总结
  2. 最新的PHP trait使用方法详解
  3. Nginx使用教程(五):使用Nginx缓存之缓存静态内容
  4. linux系统怎么用wifi,【教程】Wii安装运行可用WIFI的Linux系统全攻略
  5. “新型肺炎患者同乘查询系统”上线,超2千万用户使用
  6. jsp2自定义标签开篇
  7. 平方剩余(例题+详解+代码模板)
  8. phpcms 首页调用不同栏目的指定文章id 的content等内容 - 方法篇
  9. 旋转成分矩阵结果分析_30分钟学会PCA主成分分析
  10. 设计模式--建造者模式(C++实现)
  11. Arduino智能小车直线控制-模糊PID控制
  12. 终于找到可转载的摄影基础知识贴了
  13. JAVA相关基础知识
  14. Effective Approaches to Attention-based Neural Machine Translation笔记
  15. 阿里云-数据仓库-全链路大数据开发治理平台-DataWorks的数字世界
  16. 免费edu邮箱申请注册地址
  17. 自动将Excel数据录入网页/ERP/CRM
  18. 2022-2027年中国中药大健康行业市场调研及未来发展趋势预测报告
  19. 171023—各进制数输出:二进制转换用格式控制符输出八,十,十六进制数
  20. .net core 发布到IIS后提示错误

热门文章

  1. Try-Catch 包裹的代码异常后,竟然导致了产线事务回滚!| 原力计划
  2. 老师,你确定注释不会被执行吗?
  3. 人类和编译器谁编写的代码更快?你们的答案也许都是错的
  4. 从 Ops 到 NoOps,阿里文娱智能运维的关键:自动化应用容量管理
  5. 京东回应拖欠神州 3 亿多元货款;苹果考虑将第三方浏览器和邮件设为默认;PS 诞生 30 周年| 极客头条...
  6. 曾惨遭 Google、Tesla 淘汰,辗转 8 个月,他是如何成为一名顶尖的 AI 工程师?...
  7. 微软斥资 260 亿美元收购了 LinkedIn 后却无所作为?
  8. 2019 十大国产开源项目来势汹汹!
  9. “万物互联·泛在智能” 2019 嵌入式智能国际大会烧脑开幕!
  10. 今晚开讲 | 打卡公开课、冲击排行榜,还有福利领取