Day5 NodeJS-Events和EventEmitter

今天的主题是NodeJS中的Events和EventEmitter。在JavaScript语法中并不具备Events的原生物件,是透过执行环境如浏览器、JavaScript引擎等达到处理Events的效果,而NodeJS也扮演着相同的角色,定义了Events的Module与其中处理Events注册、触发等相关动作的Event Emitter。

Events

Events(事件)指的是应用程序中所发生的行为,在网站开发上常见的事件有使用者的操作行为,例如:滑鼠点击(click)、标签属性改变(change),或是与服务器端的资料传递,例如:request事件,可以透过监听(listen)的机制确认事件状态并在触发後执行其他程序。

在Day1的内容中有提到,NodeJS背後的结构可以分为C++部份(C++ Core)和JavaScript部份(JavaScript Core),NodeJS中的事件也有两种形式:一种是存放在C++ Core内部函式库utility的System Events(系统事件),回应及处理电脑系统中的事件,例如:档案开启与关闭;另一种是JavaScript Core函式库中的Custom Events(客制化事件),由开发人员透过JavaScript语法自定义事件。

https://ithelp.ithome.com.tw/upload/images/20210920/20139980pJIVs3k4WX.jpg

Event Emitter

Event Emitter是在NodeJS中,位於JavaScript Core的资料夹,用於存放开发人员建立的客制化事件。如前段事件说明的内容,NodeJS中的事件包含C++ Core的系统事件及JavaScript Core的客制化事件,然而,JavaScript实际上并不具备事件的概念及原生物件,因此在NodeJS里JavaScript的事件是仿造事件(fake events),透过Event Emitter的技术使开发人员能建立客制化的事件函式库,此外,C++ Core中的事件也被注册为客制化事件供JavaScript语法开发应用。

https://ithelp.ithome.com.tw/upload/images/20210920/20139980or0A0Anh1O.jpg

建立客制化事件应用的是eventsModule中的EventEmitter类别,可以由on()addListener()注册事件,再用emit()进行事件触发。在事件注册时,由於EventEmitter是一个物件,注册事件时以事件作为Name/Value中的Name、绑定事件的function作为Value,在注册相同事件名称时,会以阵列的形式纪录绑定事件的function在同一个事件上。

实作看看

on()注册事件

  1. 引用eventsModule,建立EventEmitter物件。
let EventEmitter = require("events");		// 引用events取得constructor
let emitter = new EventEmitter();
  1. 使用on()注册第一个事件greet,再以emit()触发事件。
emitter.on("greet",function(){
  console.log("First greeting!");
});

emitter.emit("greet");
  1. 执行除错印出成果。

https://ithelp.ithome.com.tw/upload/images/20210920/20139980T4fhQ8EiOR.png

注册同类事件

  1. 使用上面的程序码继续写,在触发事件前用on()注册第二个greet事件。
emitter.on("greet",function(){
  console.log("First greeting!");
});
emitter.on("greet",function(){
  console.log("Greet again.");
});

emitter.emit("greet");
  1. 执行除错,会发现emit()触发後分别印出两个greet事件绑定的内容,呼应前面说明同名称事件以阵列将函式绑定於同一个事件上。

https://ithelp.ithome.com.tw/upload/images/20210920/20139980yDHCwhYoUj.png

addListener()注册事件

  1. 使用上面的程序码再继续,以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");
  1. 执行除错,与用on()注册的事件并无差异。

https://ithelp.ithome.com.tw/upload/images/20210920/20139980OoW08iXRri.png

小结

今天的内容是针对Events和EventEmitter的概念和基本使用语法做说明,当然如果再加入前面的Module或是Class的概念可以让实作更多样,这个我想还是之後再说...今天也谢谢大家的阅读。/images/emoticon/emoticon41.gif

参考资料:

https://nodejs.org/api/

https://github.com/nodejs/node

https://developer.mozilla.org/zh-TW/docs/Web/API/Event


<<:  Day08 - Python虚拟环境

>>:  JWT实作(一)(Day5)

AE霓虹灯练习1-Day16

今天要来练习六指渊霓虹灯:https://www.sixvfx.com/night_club_neo...

【Day27】 在 Swift 中去呼叫 C/C++ 程序码

有时候进去多平台开发,或更新原本就平台的程序码时 ,需要使用现有的新技术去呼叫之前写好的 C/C++...

[Day7] 用 Python 实作 VAR 多变量时间序列预测

Hey guys, 第七篇就来实作一遍,「以传统统计方法」预测多变量时间序列吧 虽然 VAR 的准确...

Day 25. Hashicorp Vault: Diagnose Vault server

Hashicorp Vault: Diagnose Vault server 这是Vault 1.8...

【2】学习率大小的影响与学习率衰减(Learning rate decay)

Colab连结 大家应该听到烂了,学习率(Learning rate)指的是模型每做完一次 back...