购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

5.3 事件类型

Node. js的事件是由不同的类型进行区分的。

5.3.1 事件类型的定义

观察在前面章节所涉及的示例。

事件的类型是由字符串表示的。在上述示例中,事件的类型是“event”。

事件类型可以定义为任意的字符串,但约定俗成的是,事件类型通常是由不包含空格的小写单词组成的。

由于事件类型定义的灵活性,无法通过编程来判断事件发射器到底能够发射哪些类型的事件,因为事件发射器API不会提供内省机制,因此只能通过API文档来查看它能够发射的事件类型有哪些。

5.3.2 内置的事件类型

事件类型可以灵活定义,但有一些事件是由Node.js本身定义的,例如,前面章节所涉及的newListener事件和removeListener事件。当EventEmitter类实例新增监听器时,会触发newListener事件;当移除已存在的监听器时,则触发removeListener事件。

还有一类特殊的事件是指error事件。

5.3.3 error事件

当EventEmitter实例出错时,应该触发error事件。

如果没有为error事件注册监听器,则当error事件触发时,会抛出错误、打印堆栈跟踪,并退出Node.js进程。

执行程序,可以看到控制台抛出了如下错误信息。

上述错误如果没有做进一步的处理,极易导致Node.js进程崩溃。为了防止进程崩溃,有两种解决方式。

1.使用domain模块

早期Node.js的domain模块是用于简化异步代码的异常处理,可以捕捉处理try-catch无法捕捉的异常。引入domain模块的语法格式如下。

domain模块把处理多个不同的I/O的操作作为一个组。注册事件和回调到domain,当发生一个错误事件或抛出一个错误时,domain对象会被通知,不会丢失上下文环境,也不导致程序错误立即退出。以下是一个domain的示例。

需要注意的是,domain模块已经废弃了,不再推荐使用了。

2.为error事件注册监听器

作为最佳实践,应该始终为error事件注册监听器。

本节例子可以在“events-demo/error-event.js”文件中找到。 vCJW1wmbQX7XEqey7MCc1jZvbg4cH5kB3f1t/toW1EMGxDRhnOWHgNeuLkCzv/z9

点击中间区域
呼出菜单
上一章
目录
下一章
×