Day20: EventEmitter

EventEmitter就是事件监听器,在Nodejs中这事件无所不在,都是基於程序中的对象会产生事件,
会有触发事件与监听事件。透过传送讯息表示操作已经完成来触发事件。

比如: HTTP服务器

var http=require("http");
var server=http.createServer((req,res)=>
{
	 res.end("Hello Nicole");
});
server.on("connection",()=>{
    console.log("触发connection");
});
server.on("request",()=>{
    console.log("触发request");
})
server.listen(3000);

当HTTP请求时会触发connection事件和request事件。

比如: Stream

var fs=require("fs");
var stream=require("stream");
var readStream=fs.createReadStream("./heartbeat.txt");
readStream.on("data",(nicole)=>
{
    console.log("有数据可以触发!!"+"\n\n"+nicole+"\n");
});
readStream.on("end",()=>
{
    console.log("End!!!!没有更多的数据可以触发!!!");
});
readStream.on("err",()=>
{
    console.log("Error,过程发生错误");
});

Steam中的Readable会在文件开启时触发data事件,
当没有更多的数据可读时,触发end事件。
执行结果:

https://ithelp.ithome.com.tw/upload/images/20211002/201402440iM0p4vR2q.png

回到EventEmitter本身:

  • 首先导入 events模块:
var event=require("events");  //导入模块
  • 建立对象:
var nicole=new event();  //设立对象
  • 建立监听器注册事件:
EventEmitter.on(event, listener) ;

在前些日子里的例子有时候会看到on方法,比如说在DAY17: 实作提交表单的Post请求请求:

 req.on("data", (cb) => {
            arrary.push(cb);
        });

其实这个on方法就是被Events给定义的,代表插入了一个监听器,
第一个参数为"监听甚麽",第二个参数为callback函数,也就是当触发了要做些甚麽。
像是上面这个例子要监听的是data,一旦缓冲区的数据可以被读取了,就调用函数,
把阵列里的数据放到cb这个参数中。

  • 触发事件
EventEmitter.emit(event, [arg1],[arg2]);
  • 注册一个事件并触发:
//注新注册馨事件并触发
var event=require("events");
var nicole=new event();
nicole.on("start",()=>{
    console.log("nicole start");
    console.log("Hello!!Nicole!!")
});
nicole.emit("start");
console.log(nicole.eventNames());

我注册一个事件名为start,接着调用emit()触发事件。
执行结果:
https://ithelp.ithome.com.tw/upload/images/20211002/20140244qmGrfNSz9A.png

而且可以透过eventName()来看注册事件名称(显示["start"]的部分)。

处理error事件:

参考资料: 李锴 着<新时期的Node.js入门>
在Nodejs中运行时出现的任何错误都可能让整个进程退出或是崩溃,
我在实作的过程中也常常有发生错误的时候,可能有些是自己的失误,
或是某些事件未被定义,会出现以下类似的画面:

https://ithelp.ithome.com.tw/upload/images/20211002/20140244az2VlqWOpe.png

整个Nodejs会输出整个错误线,像是上面这个错误就是没有找到event这个模块(因为我打错字了…)。
但如果不想因为每次抛出一个error就使进程退出,可以使uncaughtException事件捕获异常作为最後一道防线。

//uncaughtException捕获异常
var event=require("events");
var nicole=new event();
process.on("uncaughtException",()=>
{
    console.log("ERROR!!!!!!!!!!!!!!!!!!!!");
});
throw new Error("Errpr occurred");

但经过查资料也发现,虽然这个处理方式很万用,
但若是在Web中出现错误,使用uncaughtException事件就会遗失错误发生的上下文,并不利於定位错误码。


<<:  [Lesson17] MVP

>>:  Day 17 Dockerfile 和 Docker-Compose 的差异

来画一个视力检查表吧!

前言 今天要来研究的是 canvas~ 踩下去才发现是一个大坑XD,以下先从最基本的开始认识起,最後...

Ubuntu巡航记(4) -- Rust 安装

前言 Rust 是一个现代版的 C/C++ 程序语言,它加入物件导向、套件安装(cargo)、函数式...

Day-00 引言

简简单单的开场白 这个系列的文章一开始是没有想到要出生的,但是在因缘际会之下,成为了学校深度学习课程...

Day27 简易小键盘小实作2

接续昨天 我们在按钮的action里加入这段程序码, 变数tag-1的部分就是按下1时呈现的数字是刚...

Day 7. 关於.NET新手遇到问题,我是这样建议

新手在刚开始学习时,在工作上往往会遇到许多的困难,而在这边我有一些建议可以给新手 1. 学习怎麽Go...