今天的主题是NodeJS中的Events和EventEmitter。在JavaScript语法中并不具备Events的原生物件,是透过执行环境如浏览器、JavaScript引擎等达到处理Events的效果,而NodeJS也扮演着相同的角色,定义了Events的Module与其中处理Events注册、触发等相关动作的Event Emitter。
Events(事件)指的是应用程序中所发生的行为,在网站开发上常见的事件有使用者的操作行为,例如:滑鼠点击(click)、标签属性改变(change),或是与服务器端的资料传递,例如:request事件,可以透过监听(listen)的机制确认事件状态并在触发後执行其他程序。
在Day1的内容中有提到,NodeJS背後的结构可以分为C++部份(C++ Core)和JavaScript部份(JavaScript Core),NodeJS中的事件也有两种形式:一种是存放在C++ Core内部函式库utility的System Events(系统事件),回应及处理电脑系统中的事件,例如:档案开启与关闭;另一种是JavaScript Core函式库中的Custom Events(客制化事件),由开发人员透过JavaScript语法自定义事件。
Event Emitter是在NodeJS中,位於JavaScript Core的资料夹,用於存放开发人员建立的客制化事件。如前段事件说明的内容,NodeJS中的事件包含C++ Core的系统事件及JavaScript Core的客制化事件,然而,JavaScript实际上并不具备事件的概念及原生物件,因此在NodeJS里JavaScript的事件是仿造事件(fake events),透过Event Emitter的技术使开发人员能建立客制化的事件函式库,此外,C++ Core中的事件也被注册为客制化事件供JavaScript语法开发应用。
建立客制化事件应用的是events
Module中的EventEmitter
类别,可以由on()
或addListener()
注册事件,再用emit()
进行事件触发。在事件注册时,由於EventEmitter
是一个物件,注册事件时以事件作为Name/Value中的Name、绑定事件的function
作为Value,在注册相同事件名称时,会以阵列的形式纪录绑定事件的function在同一个事件上。
用on()
注册事件
- 引用
events
Module,建立EventEmitter物件。let EventEmitter = require("events"); // 引用events取得constructor let emitter = new EventEmitter();
- 使用
on()
注册第一个事件greet
,再以emit()
触发事件。emitter.on("greet",function(){ console.log("First greeting!"); }); emitter.emit("greet");
- 执行除错印出成果。
注册同类事件
- 使用上面的程序码继续写,在触发事件前用
on()
注册第二个greet
事件。emitter.on("greet",function(){ console.log("First greeting!"); }); emitter.on("greet",function(){ console.log("Greet again."); }); emitter.emit("greet");
- 执行除错,会发现
emit()
触发後分别印出两个greet
事件绑定的内容,呼应前面说明同名称事件以阵列将函式绑定於同一个事件上。
用addListener()
注册事件
- 使用上面的程序码再继续,以
addListener()
的方式注册count
事件,再以emit()
触发事件。emitter.addListener("count",function(){ let date = new Date(); let dDate = new Date(2021,8,16); let diff = Math.floor(Math.abs(date-dDate)/(1000 * 3600 * 24))+1; console.log(`iT铁人赛第 ${diff} 天!`); }); emitter.emit("count");
- 执行除错,与用
on()
注册的事件并无差异。
今天的内容是针对Events和EventEmitter的概念和基本使用语法做说明,当然如果再加入前面的Module或是Class的概念可以让实作更多样,这个我想还是之後再说...今天也谢谢大家的阅读。
https://github.com/nodejs/node
https://developer.mozilla.org/zh-TW/docs/Web/API/Event
今天要来练习六指渊霓虹灯:https://www.sixvfx.com/night_club_neo...
有时候进去多平台开发,或更新原本就平台的程序码时 ,需要使用现有的新技术去呼叫之前写好的 C/C++...
Hey guys, 第七篇就来实作一遍,「以传统统计方法」预测多变量时间序列吧 虽然 VAR 的准确...
Hashicorp Vault: Diagnose Vault server 这是Vault 1.8...
Colab连结 大家应该听到烂了,学习率(Learning rate)指的是模型每做完一次 back...