Node. js的事件是由不同的类型进行区分的。
观察在前面章节所涉及的示例。
事件的类型是由字符串表示的。在上述示例中,事件的类型是“event”。
事件类型可以定义为任意的字符串,但约定俗成的是,事件类型通常是由不包含空格的小写单词组成的。
由于事件类型定义的灵活性,无法通过编程来判断事件发射器到底能够发射哪些类型的事件,因为事件发射器API不会提供内省机制,因此只能通过API文档来查看它能够发射的事件类型有哪些。
事件类型可以灵活定义,但有一些事件是由Node.js本身定义的,例如,前面章节所涉及的newListener事件和removeListener事件。当EventEmitter类实例新增监听器时,会触发newListener事件;当移除已存在的监听器时,则触发removeListener事件。
还有一类特殊的事件是指error事件。
当EventEmitter实例出错时,应该触发error事件。
如果没有为error事件注册监听器,则当error事件触发时,会抛出错误、打印堆栈跟踪,并退出Node.js进程。
执行程序,可以看到控制台抛出了如下错误信息。
上述错误如果没有做进一步的处理,极易导致Node.js进程崩溃。为了防止进程崩溃,有两种解决方式。
早期Node.js的domain模块是用于简化异步代码的异常处理,可以捕捉处理try-catch无法捕捉的异常。引入domain模块的语法格式如下。
domain模块把处理多个不同的I/O的操作作为一个组。注册事件和回调到domain,当发生一个错误事件或抛出一个错误时,domain对象会被通知,不会丢失上下文环境,也不导致程序错误立即退出。以下是一个domain的示例。
需要注意的是,domain模块已经废弃了,不再推荐使用了。
作为最佳实践,应该始终为error事件注册监听器。
本节例子可以在“events-demo/error-event.js”文件中找到。