Node.js 回调函数和事件
在本文中,我们将学习Node.js中的回调函数和事件。回调函数和事件都是Node.js的重要概念。让我们先学习回调函数。
回调函数概念: 回调函数是在特定任务完成后自动调用的函数。回调函数允许程序在某个任务完成之前运行其他代码。回调函数在nodeJS中被广泛使用。回调函数允许您执行大量的I/O操作,这些操作可以由操作系统处理,而无需等待任何I/O操作完成。这使得nodeJS具有高度可扩展性。
例如 : 在Node.js中,当一个函数开始读取文件时,显然会花费一些时间,因此在等待该函数完成之前,它立即返回控制权给执行环境并执行后续指令。一旦文件I/O完成,回调函数将自动调用,因此不会等待或阻塞文件I/O。
注意: 最近,回调函数被async/await取代。
语法: 让我们看一下回调函数的语法。
示例1: 在Node.js中同步读取文件的代码。创建一个文本文件input.txt,其中包含以下内容:
现在,创建一个名为main.js的javascript文件,其中包含以下代码。
现在使用以下命令运行main.js以查看结果:
解释 :在这个示例中,我们有一个nodeJS的fs模块,它提供了文件I/O操作的功能。借助readFileSync()函数,我们能够在这里使用同步的方法,也被称为阻塞函数,因为它会等待每个指令完成后再进入下一个指令。因此,在这个示例中,这个函数会阻塞程序,直到它读取完文件,然后继续执行程序的后续部分。
输出:
示例2: 在Node.js中异步读取文件的代码。保持“input.txt”文件与之前相同。以下是main.js的代码:
现在运行main.js,使用以下命令查看结果:
解释: 利用readFile()函数的帮助,我们能够在此处使用异步的方式,也被称为非阻塞函数,因为它不会等待每个指令完成,而是在第一次执行时就会执行所有操作。因此,在此示例中,该函数在后台运行,控制流程会返回到下一个指令。当后台任务完成时,回调函数被调用。
输出:
事件: 计算机上的每个操作都称为事件。在nodeJS中,对象可以触发事件。根据Node.js的官方文档,它是一个异步事件驱动的JavaScript运行时。Node.js具有事件驱动的架构,可以执行异步任务。Node.js有一个名为“events”的模块,可以发出命名事件,从而导致相应的函数或回调被调用。函数(回调)监听或订阅特定事件的发生,当该事件触发时,所有订阅该事件的回调以注册的顺序依次触发。
EventEmmitter类: 所有发出事件的对象都是EventEmitter类的实例。可以通过EventEmitter发出或监听事件。
语法:
以下表格列出了EventEmitter类的所有重要方法:
EventEmitter方法 | 描述 |
---|---|
eventEmitter.addListener(event, listener) && eventEmitter.on(event, listener) | eventEmmitter.on(event, listener)和eventEmitter.addListener(event, listener)基本相同。它将监听器添加到指定事件的监听器数组的末尾。对相同的事件和监听器进行多次调用会将监听器添加多次,并相应地触发多次。这两个函数都返回一个emitter,可以进行链式调用。 |
eventEmitter.once(event, listener) | 它最多触发一次特定事件,并在监听一次后从监听器数组和事件数组中删除。返回emitter,因此可以进行链式调用。 |
eventEmitter.emit(event, [arg1], [arg2], […]) | 在nodeJS中,每个事件都有一个名称。我们可以通过emit(event, [arg1], [arg2], […])函数来触发事件。我们可以向监听器函数传递任意一组参数。 |
eventEmitter.removeListener(event, listener) | 它接收两个参数,事件和监听器,并从订阅该事件的监听器数组中删除该监听器。 |
eventEmitter.removeAllListeners() | 它将从订阅指定事件的数组中删除所有监听器。 |
eventEmitter.getMaxListeners(n) | 它将返回由setMaxListeners()设置的最大监听器值,或默认值为10。 |
EventEmitter.defaultMaxListeners | 默认情况下,对于任何单个事件,最多可以注册10个监听器。要更改所有EventEmitter实例的默认值,可以使用此属性。 |
eventEmitter.listeners(event) | 它返回指定事件的监听器数组。 |
eventEmitter.listenerCount() | 它返回监听指定事件的监听器的数量。 |
eventEmitter.prependOnceListener() | 它将一次性监听器添加到数组的开头。 |
eventEmitter.prependListener() | 它将监听器添加到数组的开头。 |
示例 1: 创建一个简单事件程序的代码:
现在运行main.js文件以查看结果,使用以下命令:
输出:
示例2: 此示例展示了监听器的创建和移除。EventEmitter实例将发出自己的“newListener”事件。在移除监听器之后将会发出“removeListener”事件。
现在用以下命令运行main.js来查看结果:
输出: