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

5.1 理解事件和回调

在Node.js应用中,事件无处不在。例如,net.Server会在每次有新连接时触发事件,fs.ReadStream会在打开文件时触发事件,stream会在数据可读时触发事件。

在Node.js的事件机制中主要有三类角色:事件(Event)、事件发射器(Event Emitter)、事件监听器(Event Listener)。

所有能触发事件的对象在Node.js中都是EventEmitter类的实例。这些对象有一个eventEmitter.on()函数,用于将一个或多个函数绑定到命名事件上。事件的命名通常是驼峰式的字符串。

当EventEmitter对象触发一个事件时,所有绑定在该事件上的函数都会被同步地调用。

以下是一个简单的EventEmitter实例,绑定了一个事件监听器。

在上述例子中,eventEmitter.on()用于注册监听器,eventEmitter.emit()用于触发事件。其中,eventEmitter.on()是一个典型的异步编程模式,而且与回调函数密不可分,而回调函数就是后继传递风格的一种体现。后继传递风格是一种控制流通过参数传递的风格。简单来说就是把下一步要运行的代码封装成函数,通过参数传递的方式传给当前运行的函数。

所谓回调,就是“回头再调”的意思。在上述例子中,myEmitter先注册了event事件,同时绑定了一个匿名的回调函数。该函数并不是马上执行,而是需要等到事件触发了以后再执行。

5.1.1 事件循环

Node. js是单进程单线程应用程序,但是因为V8引擎提供了异步执行回调接口,通过这些接口可以处理大量的并发请求,所以性能非常高。

Node. js几乎每一个API都是支持回调函数的。

Node. js基本上所有的事件机制都是用设计模式中的观察者模式实现。

Node. js单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数。

5.1.2 事件驱动

图5-1所示为事件驱动模型示意图。

图5-1 事件驱动模型

Node. js使用事件驱动模型,当服务器接收到请求,就把它关闭进行处理,然后去服务下一个请求。当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

这个模型非常高效,可扩展性非常强,因为服务器一直接受请求而不等待任何读写操作。

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

整个事件驱动的流程有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。 I25TE2Db7Vg5MIvUP5DXXe84FKvT4Gg337E/2qVgHHRKLLQOd+cLp74wz8BFMYpZ

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