EventEmitter的前端实现
EventEmitter简介
API介绍
- on(event, listener):为指定事件注册一个监听器,接受一个字符串 event 和一个回调函数。
- emit(event, [arg1], [arg2]): 按监听器的顺序执行执行每个监听器
- addListener(event, listener):on的同名函数(alias)
- once(event, listener): 和on类似,但只触发一次,随后便解除事件监听
- removeListener(event, listener): 移除指定事件的某个监听回调
- removeAllListeners([event]):移除指定事件的所有监听回调
- setMaxListeners(n):用于提高监听器的默认限制的数量。(默认10监听回调个产生警告)
- listeners(event): 返回指定事件的监听器数组。
构造函数
- function EventEmitter() {
- this.listeners = {};
- this.maxListener = 10;
- }
listeners用于存放事件监听器函数,结构如下:
- {
- "event1": [f1,f2,f3],
- "event2": [f4,f5],
- ...
- }
而maxListener 是设置的某个事件能够添加的监听器的最大数量,超过这个值,需要在控制台输出警告,但不会报错阻止。按照Node的设计,这个值能够通过setMaxListeners动态调整
on方法
- 判断该事件的监听器数量是否已超限,超限则报警告
- 判断该事件监听器数组是否初始化,若未初始化,则将listeners[event]初始化为数组,并加入监听器cb
- 若监听器数组已经被初始化,则判断数组中是否已存在cb,不存在则添加,已存在则不做操作。
- 指定addListener等于on方法
- EventEmitter.prototype.on = function (event, cb) {
- var listeners = this.listeners;
- if (listeners[event] && listeners[event].length >= this.maxListener) {
- throw console.error('监听器的最大数量是%d,您已超出限制', this.maxListener)
- }
- if (listeners[event] instanceof Array) {
- if (listeners[event].indexOf(cb) === -1) {
- listeners[event].push(cb);
- }
- } else {
- listeners[event] = [].concat(cb);
- }
- }
- EventEmitter.prototype.addListener = EventEmitter.prototype.on;
emit方法
- 通过Array.prototype.slice.call(arguments)取出方法的参数列表args,(因为考虑简单性和兼容性所以采用ES5的冗长编码方式)
- 调用args.shift踢掉数组第一个参数即event,留下来的这些是要传给监听器的
- 遍历监听器,通过apply方法把上面得到的args参数传进去
- EventEmitter.prototype.emit = function (event) {
- var args = Array.prototype.slice.call(arguments);
- args.shift();
- this.listeners[event].forEach(cb => {
- cb.apply(null, args);
- });
- }
removeListener方法
- 通过indexOf确定监听器回调在数组listeners[event]中的位置
- 通过splice(i,1)删除之
- EventEmitter.prototype.removeListener = function (event, listener) {
- var listeners = this.listeners;
- var arr = listeners[event] || [];
- var i = arr.indexOf(listener);
- if (i >= 0) {
- listeners[event].splice(i, 1);
- }
- }
once方法
- EventEmitter.prototype.once = function (event, listener) {
- var self = this;
- function fn() {
- var args = Array.prototype.slice.call(arguments);
- listener.apply(null, args);
- self.removeListener(event, fn);
- }
- this.on(event, fn)
- }
removeAllListener方法
- EventEmitter.prototype.removeAllListener = function (event) {
- this.listeners[event] = [];
- }
setMaxListeners方法和listeners方法
- EventEmitter.prototype.listeners = function (event) {
- return this.listeners[event];
- }
- EventEmitter.prototype.setMaxListeners = function (num) {
- this.maxListener = num;
- }
Github地址
EventEmitter的前端实现的更多相关文章
- 执行 $Gulp 时发生了什么 —— 基于 Gulp 的前端集成解决方案(二)
前言 文章 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一) 中,已经完成对 gulp 的安装,由于是window环境,文中特意提到了可以通过安装 gitbash 来代替 ...
- Node.js 教程 05 - EventEmitter(事件监听/发射器 )
目录: 前言 Node.js事件驱动介绍 Node.js事件 注册并发射自定义Node.js事件 EventEmitter介绍 EventEmitter常用的API error事件 继承EventEm ...
- 闲聊——浅谈前端js模块化演变
function时代 前端这几年发展太快了,我学习的速度都跟不上演变的速度了(门派太多了,后台都是大牛公司支撑类似于facebook的react.google的angular,angular的1.0还 ...
- Gulp vs Grunt 前端构建工具对比
Gulp vs Grunt 前端工程的构建工具对比 1. Grunt -> Gulp 早些年提到构建工具,难免会让人联想到历史比较悠久的Make,Ant,以及后来为了更方便的构建结构类似的Jav ...
- 前端工程的构建工具对比 Gulp vs Grunt
1. Grunt -> Gulp 早些年提到构建工具,难免会让人联想到历史比较悠久的Make,Ant,以及后来为了更方便的构建结构类似的Java项目而出现的Maven.Node催生了一批自动化工 ...
- 【前端】Angular2 Ionic2 学习记录
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/angular2_ionic2.html 一.建立项目 ionic start ProductName super ...
- BAT 前端开发面试 —— 吐血总结
更好阅读,请移步这里 聊之前 最近暑期实习招聘已经开始,个人目前参加了腾讯和阿里的内推及百度的实习生招聘,在此总结一下 一是备忘.总结提升,二是希望给大家一些参考 其他面试及基础相关可以参考其他博文: ...
- 如何才能成为一个合格的web前端工程师
转载原文地址:https://juejin.im/post/5cc1da82f265da036023b628 开篇前端开发是一个非常特殊的行业,它的历史实际上不是很长,但是知识之繁杂,技术迭代速度之快 ...
- BAT 前端开发面经 —— 吐血总结
更好阅读,请移步这里 聊之前 最近暑期实习招聘已经开始,个人目前参加了阿里的内推及腾讯和百度的实习生招聘,在此总结一下 一是备忘.总结提升,二是希望给大家一些参考 其他面试及基础相关可以参考其他博文: ...
随机推荐
- Python一秒提供Rest接口
Python一秒提供Rest接口 使用的是Anaconda安装的Python环境; 新建py文件(例如:restapi.py) # -*- coding: utf-8 -*- from flask i ...
- 一些ServiceFabric、Orleans、Asp.net Aore的例子
Sample: ServiceFabric + Orleans + Asp.net Core : Asp.net Core 142 samples for ASP.NET Core 2.1 funda ...
- Python趣用—配平化学方程式
不知不觉已经毕业多年了,不知道大家是否还记得怎么配平化学方程式呢?反正小编我是已经记不太清了,所以今天的文章除了分享如何用python配平化学方程式,顺带着还会复习 一些化学方程式的知识,希望广大化学 ...
- 一文带你了解git
git简介 什么是git? git是当今世界上最先进的分布式的版本控制系统. 版本控制系统分集中式的和分布式的,集中式的主要代表有CVS.SVN,而Git是分布式版本控制系统的佼佼者. 那什么是集中式 ...
- YOLO V1损失函数理解
YOLO V1损失函数理解: 首先是理论部分,YOLO网络的实现这里就不赘述,这里主要解析YOLO损失函数这一部分. 损失函数分为三个部分: 代表cell中含有真实物体的中心. pr(object) ...
- springBean生命周期----来自spring实战总结
1.Spring对bean进行实例化 2.Spring将值和bean的引用注入到bean对应的属性中(比如说注入到被依赖的bean的方法中或属性里) 3.如果bean实现了BeanNameAware接 ...
- markdown插入表格语法
markdown插入表格语法 举例 如表格标题为,姓名,班级,成绩 标题内的内容为,yang,a班,100 我们要在markdow文件中插入表格 如 姓名|班级|成绩 -|-|- yang|a班|10 ...
- [剑指offer] 10. 旋转数组的最小数字
题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 思路: 利用dp[i]保存盖2*i的矩形有多少种办法. 通过 ...
- 用框架名唬人谁都会,那你知道Web开发模式吗?——莫问前程莫装逼
前言:这两天总结了一些Servlet和JSP里面的知识,写了几篇博客,果然有种“温故而知新”的感觉,学完这些,继续前行,开始整合框架里的知识,框架虽好,可底层原理该掌握的也得掌握,防止以后做项目的时候 ...
- MyEclipse2014破解版
百度云:链接:http://pan.baidu.com/s/1c3jKMa 密码:yss0 等版本)后,不要打开软件. 二.解压破解文件压缩包,得到一下文件列表: 三.双击run.bat,即可运行cr ...