日常的学习笔记,包括 ES6、Promise、Node.js、Webpack、http 原理、Vue全家桶,后续可能还会继续更新 Typescript、Vue3 和 常见的面试题 等等。
Events模块
参考官网 events 事件触发器 | Node.js
Events
模块是Node最重要的模块,它提供了一个属性 EventEmitter
,EventEmitter
的核心是事件发射与事件监听器。
Node中大部分的模块,都继承自 Events
模块。
Events
模块是Node对 发布订阅模式(publish/subscribe
)的实现。一个对象通过这个模块,向另一个对象传递消息。- 该模块通过
EventEmitter
属性,提供了一个构造函数。该构造函数的实例具有on
方法,可以用来监听指定事件,并触发回调函数。 - 任意对象都可以发布指定事件,被
EventEmitter
实例的on方法监听到。
发布订阅模式
关于 发布订阅模式 ,可以参考我之前的博客文章。
关于 Events
中的发布订阅模式,我们要先清楚它的几个常用方法。
- 订阅方法:
on
方法用来订阅事件,订阅是将方法对应成一种一对多的关系。 - 发布方法:
emit
用来执行订阅的事件。 - 取消订阅:
off
方法可以移除对应的事件监听。 - 订阅一次:
once
绑定事件当执行后自动删除订阅的事件。
on 和 emit
on
方法的第一个参数用来设定类名,第二个参数也是一个函数,里面可以接收发布时传入的参数。
emit
方法第一个参数是类名,之后的参数都是传入 on
方法函数中的参数。
on
和 emit
具体应用可以参考下面这个简单的Demo。
1 | const EventEmitter = require('events'); |
现在我们可以实现一套 on
和 emit
方法。
1 | function EventEmitter() { |
off
off
方法的第一个参数用来设定类名,第二个参数传入需要被移除的函数回调。
1 | // ... |
这样我们可以大概判断出来,移除掉和我们传入函数相同的函数,我们很快想到 filter 方法。
1 | // off 方法 |
once
once
方法的第一个参数用来设定类名,第二个参数传入只需要执行一次的函数回调。
1 | // ... |
这样我们可以根据之前实现的 on
和 off
来实现此方法。
1 | // once 方法 |
看起来这个方法好像没有什么问题,执行起来也全都是正确的。
但是在一种特殊情况下的时候,还是出现了错误。
那种情况就是如果我们在执行 once
方法之前,就已经通过 off
方法将其移除了。
我们实现的方法就不能实现这个需求了,所以我们还需要对 once
方法进行一些修改 ( off
方法已经处理过了)。
添加一个自定义属性,用来对函数进行 “缓存” 。
1 | EventEmitter.prototype.once = function (eventName, callBack) { |
这样我们就实现了 once
方法。
本篇文章由莫小尚创作,文章中如有任何问题和纰漏,欢迎您的指正与交流。
您也可以关注我的 个人站点、博客园 和 掘金,我会在文章产出后同步上传到这些平台上。
最后感谢您的支持!