NodeJS中的事件驱动程序实现原理解析

前言

Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

这个模型非常高效可扩展性非常强,因为 webserver 一直接受请求而不等待任何读写操作。(这也称之为非阻塞式IO或者事件驱动IO)

在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。

NodeJS中的事件驱动程序实现原理解析

整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

NodeJS中的事件驱动程序实现原理解析

一、应用实例

创建demo2.js,代码如下:

NodeJS中的事件驱动程序实现原理解析

运行结果如下:

NodeJS中的事件驱动程序实现原理解析

二、Node 应用程序是如何工作的?

在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

接下来让我们来看下前面的实例,创建一个 input.txt,文件内容如下:

NodeJS中的事件驱动程序实现原理解析

创建 demo3.js 文件,代码如下:

NodeJS中的事件驱动程序实现原理解析

以上程序中 fs.readFile() 是异步函数用于读取文件。如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。执行以上代码,执行结果如下:

NodeJS中的事件驱动程序实现原理解析

接下来我们删除 input.txt 文件,执行结果如下所示:

NodeJS中的事件驱动程序实现原理解析

因为文件 input.txt 不存在,所以输出了错误信息。