事件

  • 在前端浏览器最常见的就是页面交互事件
  • 本质是发布/订阅设计模式

目标

  • 对象使用add方法订阅事件。
  • 使用emit发布消息

订阅事件

  • 添加触发事件的一个唯一字符串,以及对应的处理函数
  • 先初始化事件对象
class Event {constructor(){this.events = {};}
}
  • 订阅
  • 在订阅事件的时候,需要先判断事件是否存在.
  • 若不存在,则直接加入到队列(数组)
  • 若存在,则放到队尾(push进入)
class Event {constructor(){...},add(name, cb) {if (this.map[name]) {this.map[name].push(fn);return;}this.map[name] = [fn];return;}
}

发布事件

  • 当使用emit方法是,传入的第一个参数是事件的名称.
  • emit方法会根据传入的名称,找到对应的事件处理组.
  • 利用事件处理组对后面的参数进行依次调用
class Event {constructor(){ ... }emit(name, ...args) {this.map[name].forEach( cb => {cb(...args);})}
}

调用

const e = new Event();
e.add('sayHello', (err, name) =>{if(err) {console.error(err);return}console.log(`hello ${name}`);return
})
e.emit('sayHello','发生了错误');
e.emit('sayHello', null, 'marron');


链式调用的实现

  • 想使用如下的方式进行调用
const e = new Event();
e
.add('sayHello', (err, name) =>{if(err) {console.error(err);return;}console.log(`hello ${name}`);
})
.emit('sayHello', '发生了错误')
.emit('sayHello', null, 'mar~!');
  • 只需保证调用add后的执行还是当前的实例(e)即可
  • 在类Event的内部,this指向的是当前的实例,因此只需在add方法中返回this即可实现
  • 改写Event,注意return 语句
class Event {constructor() {this.events = {};}add(name, cb) {if (this.events[name]) {this.events[name].push(cb);return this; // 返回当前实例}this.events[name] = [cb];return this;}emit(name, ...args) {if (this.events[name]) {this.events[name].forEach(cb => {cb(...args);})return this;} else {console.error('[Event Error]: 该事件未注册')}}
}

node --- 模拟事件的异步相关推荐

  1. node - 非阻塞的异步 IO

    node - 非阻塞的异步 IO 每当我们提起 node.js 时总会脱口而出 事件驱动.非阻塞I/O 和 单线程,所以我总结了以下几点对这三项概念的阐述,不一定正确仅仅代表个人观点. 单线程 当一个 ...

  2. Linux事件循环阻塞,深入浅析Node.js 事件循环、定时器和process.nextTick()

    什么是事件循环 尽管JavaScript是单线程的,但通过尽可能将操作放到系统内核执行,事件循环允许Node.js执行非阻塞I/O操作. 由于现代大多数内核都是多线程的,因此它们可以处理在后台执行的多 ...

  3. 基于事件的异步模式——BackgroundWorker

    转自strangeman原文 基于事件的异步模式--BackgroundWorker 实现异步处理的方法很多,经常用的有基于委托的方式,今天记录的是基于事件的异步模式.利用BackgroundWork ...

  4. 详解浏览器和Node的事件循环机制及区别

    关于事件循环机制(详解) 前言 一.浏览器的事件循环机制 二.Node的事件循环机制 三.两者的区别 前言 JS是单线程的脚本语言,即在同一时间只能做一件事.为了协调时间.用户交互.脚本.UI渲染和网 ...

  5. 如何构建自定义 Node.js 事件发射器

    事件是具有软件或硬件意义的动作. 它们是由于用户活动(例如鼠标单击或击键)或直接来自系统(例如错误或通知)而发出的. JavaScript 语言使我们能够通过在事件处理程序中运行代码来响应事件. 由于 ...

  6. Jest的好帮手 Enzyme ,模拟事件测试 测试异常

    Enzyme Enzyme是Airbnb开源的React测试工具库库,它对官方的测试工具库ReactTestUtils的二次封装,提供了一套简洁强大的 API,并内置Cheerio 实现了jQuery ...

  7. F#与ASP.NET(1):基于事件的异步模式与异步Action

    提高ASP.NET应用程序伸缩性的有效手段之一便是使用异步请求.而在ASP.NET MVC 1中是不能直接支持异步Action的,因此我们需要使用一些简单的Hack方式来实现这一点.不过简单的Hack ...

  8. C# 基于事件的异步模式

    点击蓝字 关注我们 开工大吉 EventBasedAsyncPattern 方法使用了基于事件的异步模式.这个模式定义了一个带有 "Async" 后缀的方法.示例代码再次使用了We ...

  9. 【转】1.7异步编程:基于事件的异步编程模式(EAP)

    传送门:异步编程系列目录-- 上一篇,我给大家介绍了".NET1.0 IAsyncResult异步编程模型(APM)",通过Begin*** 开启操作并返回IAsyncResult ...

最新文章

  1. Redis应用----消息传递
  2. php实现小说字典功能_四十章 PHP实现获取并生成数据库字典的方法
  3. c2064 项不会计算为接受0个参数的函数_无网格法理论与Matlab程序设计(6)——传统径向基点插值(RPIM)形函数...
  4. ITK:使用多线程过滤图像
  5. php+控制器+数据库,Laravel5.1数据库连接、创建数据库、创建model及创建控制器的方法_PHP...
  6. 用Bi-GRU语义解析,实现中文人物关系分析 | 附完整代码
  7. python爬取网页实时数据_使用 Python 爬取网页数据
  8. LeetCode 236. 二叉树的最近公共祖先(递归)
  9. winform 拖动无边框窗体(调用Windows API)
  10. 小白初学Vue之 组件与实例的关系 初试篇
  11. 软件观念革命:交互设计精髓_2021年中国传媒大学设计学考研招生分析、参考书目、复试线、真题回忆、考研经验指南篇...
  12. xml文件导入wps_Office12使用XML格式存储文件回击WPS
  13. PR常见问题:pr导入素材没有音轨怎么办
  14. 阿里的BUG智能定位神器!直接定位线上BUG,超给力!必须收藏!
  15. 为什么阿里云ACE考试变难了?以后还能考吗?
  16. 如何录制自己手机视频
  17. 矩阵笔记1:矩阵分析(第三版)-史荣昌-第一章:线性空间和线性变换
  18. android 脚本不被杀死,fgo用自动刷脚本会不会封号无需安卓
  19. 嵌入式实践教程--i.MX8M family Secure Boot HABv4签名实战
  20. WebAssembly 与 Kubernetes双剑合璧

热门文章

  1. linux 查找文件夹_用python打造一个基于socket的文件(夹)传输系统
  2. python3闭包通俗解释_Python|闭包、装饰器,简单的实例,通俗的理解
  3. 虚拟局域网软件开源_ZeroTier虚拟局域网免费远程桌面体验--替代TeamViewer
  4. pc端jquery左右按钮控制带缩略图的图片切换代码_Web开发实用的图片预览插件,简单零依赖——PhotoSwipe...
  5. 插值算法及matlab实现,MATLAB 插值算法实现
  6. vue通过class获取dom_.NET Core通过Json或直接获取图形验证码(务必收藏备用)
  7. php传二维数组,JS用POST怎么传送二维数组给PHP
  8. MKL学习——向量操作
  9. Windows 聚焦的锁屏壁纸设置为桌面壁纸
  10. Centos6.10源码部署zabbix-3.2.6