Node.js 中的顺序功能

2025年2月11日 | 阅读 6 分钟

在 Node.js 中,顺序功能是指代码按顺序执行的能力,即一项任务完成后才开始下一项任务。这对于异步任务至关重要,因为执行顺序很重要,例如读取文件、发起网络请求和查询数据库。可以使用两种方法来顺序或同步地执行不同的异步函数。

1. 回调函数

在 Node.js 中,回调函数经常用作事件处理程序,尤其是在文件读取等异步操作中。回调函数在异步操作(例如读取文件)完成后被调用。

使用循环所需的回调函数,并行读取文件。需要一个递归函数来连续读取文件。该函数检查它是否已达到最后一个文件。如果是,则完成;如果不是,则在下一个文件中读取。

它经常用于并行读取文件,通过迭代文件路径数组并并发读取每个文件来利用回调函数。通常在循环中执行,其中使用回调函数为每次迭代启动异步文件读取操作。事件循环通过在并发读取文件时处理其他任务来确保有效的资源利用和提高效率。

在 Node.js 中,回调函数对于管理文件读取等异步进程至关重要。回调使 Node.js 应用程序能够有效地执行任务,确保正确的排序和事件处理,同时防止事件循环被阻塞,无论是顺序读取文件还是并行读取文件。即使回调在更大或更复杂的应用程序中功能强大,但考虑 Promises 或 async/await 等替代方法来更有效地管理异步代码也很重要。

示例

让我们举一个例子来说明在 Node.js 中使用 回调函数实现顺序功能。

输出

 
Error reading the files: [Error: ENOENT: no such file or directory, open 'Example1.txt'] {
  errno: -2,
  code: 'ENOENT',
  syscall: 'open',
  path: 'Example1.txt'
}

说明

此 Node.js 代码异步读取 `file_Paths` 数组中列出的文件。它提供了两个函数:readFile,它读取单个文件;readFilesSequentially,它递归地逐个读取文件。所有文件读取完毕后,递归函数将所有文件合并的数据传递给回调函数。然后,在调用 `readFilesSequentially` 并提供初始参数后,将合并的文件数据记录到控制台。这种方法使用回调函数来温和地处理错误并确保后续的文件读取。

2. 使用 Promises

Node.js 中的 Promise 设计模式有助于减少处理异步 JavaScript 代码的工作量,从而避免了所谓的“回调地狱”。

Promise 构造函数用于创建 Promise。它接受一个函数作为输入,并返回两个参数:resolvereject。它在此函数内部执行异步操作,然后如果成功则使用结果调用 `resolve`,如果失败则使用错误调用 `reject`。

Promise 有 3 种状态

  • Pending: Promise 既未 fulfilled 也未 rejected 的初始阶段称为“pending”。
  • Rejected:这表示操作成功,Promise 返回了一个值。
  • Resolved:表示操作失败,Promise 通常有一个错误作为失败的原因。

以下是一些避免 Node.js 回调地狱的其他设计方法:

使用 Async.series 顺序执行任务。

使用 Async/Await 顺序执行任务。

使用 Async.waterfall 顺序执行任务。

Promise 对于管理 JavaScript 中的异步操作至关重要。与基于回调的方法相比,它提供了一种更结构化、更易读的处理异步代码的方法。在现代 JavaScript 应用程序中,Promise 因其改进的错误处理、顺序执行和更清晰的语法而成为管理异步任务的首选。

示例

让我们再举一个例子来说明在 Node.js 中使用 Promise 实现顺序功能。

输出

 
Error reading the files:

说明

Node.js 代码使用 Promise 读取 `file_Paths` 中提供的文件数组。单个文件的异步读取基于 `readFile` 函数,该函数根据成功或失败来解析或拒绝 Promise。为了确保顺序文件读取,`readFilesSequentially` 方法使用 `Array.reduce` 来链接 Promise。使用一个已解析的 Promise 和一个空数组来启动第一个 Promise 链。成功解析后,最终会将合并的文件数据打印到控制台,而错误则使用 `catch` 方法捕获并记录。此方法提供了一种在按顺序读取文件时处理错误的有效方法。

3. 使用 Async/Await

JavaScript 的 Async/Await 语法功能以更类似于同步行为的方式管理异步操作。为了允许与现有的基于 Promise 的应用程序无缝集成,async 函数会返回一个 Promise。

如果发生错误,async 函数将自动拒绝 Promise。另一方面,如果函数成功完成并返回值,则 Promise 将使用该值进行解析。

由于错误会自动向下传递到 Promise 链,除非被特别捕获,否则在 async 函数中处理错误非常简单。

示例

输出

 
First addition result: 14
Second addition result: 24
Third addition result: 34
Fourth addition result: 44
Fifth addition result: 54
The final sum is: 172

说明

此代码说明了如何在 Node.js 中使用 async/await 以顺序方式处理 Promise。如果 x 为负数,则 `addIntAfter4Seconds` 方法会因错误消息而被拒绝,并返回一个在 2 秒后解析的 Promise,将 4 加到输入值 x。异步 `addAsync` 方法会等待每次调用并记录其中间结果。它连续调用 `addIntAfter4Seconds` 五次。为了管理异步过程中可能发生的任何潜在故障,它还使用了 try...catch 块。当最终使用值 x = 2 调用 `addAsync` 时,如果已成功计算出结果,则会将结果总和显示到控制台。