node --- 模拟事件的异步
事件
- 在前端浏览器最常见的就是页面交互事件
- 本质是发布/订阅设计模式
目标
- 对象使用
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 --- 模拟事件的异步相关推荐
- node - 非阻塞的异步 IO
node - 非阻塞的异步 IO 每当我们提起 node.js 时总会脱口而出 事件驱动.非阻塞I/O 和 单线程,所以我总结了以下几点对这三项概念的阐述,不一定正确仅仅代表个人观点. 单线程 当一个 ...
- Linux事件循环阻塞,深入浅析Node.js 事件循环、定时器和process.nextTick()
什么是事件循环 尽管JavaScript是单线程的,但通过尽可能将操作放到系统内核执行,事件循环允许Node.js执行非阻塞I/O操作. 由于现代大多数内核都是多线程的,因此它们可以处理在后台执行的多 ...
- 基于事件的异步模式——BackgroundWorker
转自strangeman原文 基于事件的异步模式--BackgroundWorker 实现异步处理的方法很多,经常用的有基于委托的方式,今天记录的是基于事件的异步模式.利用BackgroundWork ...
- 详解浏览器和Node的事件循环机制及区别
关于事件循环机制(详解) 前言 一.浏览器的事件循环机制 二.Node的事件循环机制 三.两者的区别 前言 JS是单线程的脚本语言,即在同一时间只能做一件事.为了协调时间.用户交互.脚本.UI渲染和网 ...
- 如何构建自定义 Node.js 事件发射器
事件是具有软件或硬件意义的动作. 它们是由于用户活动(例如鼠标单击或击键)或直接来自系统(例如错误或通知)而发出的. JavaScript 语言使我们能够通过在事件处理程序中运行代码来响应事件. 由于 ...
- Jest的好帮手 Enzyme ,模拟事件测试 测试异常
Enzyme Enzyme是Airbnb开源的React测试工具库库,它对官方的测试工具库ReactTestUtils的二次封装,提供了一套简洁强大的 API,并内置Cheerio 实现了jQuery ...
- F#与ASP.NET(1):基于事件的异步模式与异步Action
提高ASP.NET应用程序伸缩性的有效手段之一便是使用异步请求.而在ASP.NET MVC 1中是不能直接支持异步Action的,因此我们需要使用一些简单的Hack方式来实现这一点.不过简单的Hack ...
- C# 基于事件的异步模式
点击蓝字 关注我们 开工大吉 EventBasedAsyncPattern 方法使用了基于事件的异步模式.这个模式定义了一个带有 "Async" 后缀的方法.示例代码再次使用了We ...
- 【转】1.7异步编程:基于事件的异步编程模式(EAP)
传送门:异步编程系列目录-- 上一篇,我给大家介绍了".NET1.0 IAsyncResult异步编程模型(APM)",通过Begin*** 开启操作并返回IAsyncResult ...
最新文章
- Redis应用----消息传递
- php实现小说字典功能_四十章 PHP实现获取并生成数据库字典的方法
- c2064 项不会计算为接受0个参数的函数_无网格法理论与Matlab程序设计(6)——传统径向基点插值(RPIM)形函数...
- ITK:使用多线程过滤图像
- php+控制器+数据库,Laravel5.1数据库连接、创建数据库、创建model及创建控制器的方法_PHP...
- 用Bi-GRU语义解析,实现中文人物关系分析 | 附完整代码
- python爬取网页实时数据_使用 Python 爬取网页数据
- LeetCode 236. 二叉树的最近公共祖先(递归)
- winform 拖动无边框窗体(调用Windows API)
- 小白初学Vue之 组件与实例的关系 初试篇
- 软件观念革命:交互设计精髓_2021年中国传媒大学设计学考研招生分析、参考书目、复试线、真题回忆、考研经验指南篇...
- xml文件导入wps_Office12使用XML格式存储文件回击WPS
- PR常见问题:pr导入素材没有音轨怎么办
- 阿里的BUG智能定位神器!直接定位线上BUG,超给力!必须收藏!
- 为什么阿里云ACE考试变难了?以后还能考吗?
- 如何录制自己手机视频
- 矩阵笔记1:矩阵分析(第三版)-史荣昌-第一章:线性空间和线性变换
- android 脚本不被杀死,fgo用自动刷脚本会不会封号无需安卓
- 嵌入式实践教程--i.MX8M family Secure Boot HABv4签名实战
- WebAssembly 与 Kubernetes双剑合璧
热门文章
- linux 查找文件夹_用python打造一个基于socket的文件(夹)传输系统
- python3闭包通俗解释_Python|闭包、装饰器,简单的实例,通俗的理解
- 虚拟局域网软件开源_ZeroTier虚拟局域网免费远程桌面体验--替代TeamViewer
- pc端jquery左右按钮控制带缩略图的图片切换代码_Web开发实用的图片预览插件,简单零依赖——PhotoSwipe...
- 插值算法及matlab实现,MATLAB 插值算法实现
- vue通过class获取dom_.NET Core通过Json或直接获取图形验证码(务必收藏备用)
- php传二维数组,JS用POST怎么传送二维数组给PHP
- MKL学习——向量操作
- Windows 聚焦的锁屏壁纸设置为桌面壁纸
- Centos6.10源码部署zabbix-3.2.6