理解事件和回调
在Node.js应用中,事件无处不在。例如,net.Server
会在每次有新连接时触发事件,fs.ReadStrem
会在打开文件时触发事件,stream会在数据可读时触发事件。
在Node.js的事件机制中主要有三类角色:事件(event)、事件发射器(event Emitter)、事件监听器(Event Listener)
所有能触发事件的对象在Node.js中都是EventEmitter类的实例。这些对象有一个eventEmitter.on()
函数,用于将一个或多个函数绑定到命名事件上。事件的命名通常是驼峰式的字符串。
当EventEmitter对象触发一个事件时,所有绑定在该事件上的函数都会被同步地调用
以下是一个简单的EventEmitter实例,绑定了一个事件监听器
const EventEmitter = require("events") class MyEmitter extends EventEmitter {} const myEmitter = new MyEmitter() // 注册监听器 myEmitter.on("event", () => { console.log("触发事件") )} // 触发事件 myEmitter.emit("event") 复制代码
在上述例子中,EventEmitter()用于注册监听器,EventEmitter.emit()用于触发事件。其中,eventEmitter.on()是一个典型的异步编程模式,而且与回调函数密不可分,而回调函数就是后继传递风格的一种体现。后继传递风格是一种控制流通过参数传递的风格。简单来说就是把下一步要运行的代码封装成函数,通过参数传递的方式传给当前运行的函数。
所谓回调,就是"回头再调用"的意思。再上述例子中,myEmitter先注册了event事件,同时绑定了一个匿名的回调函数。该函数并不是立马执行,而是需要等到事件触发了以后再执行。