Node.js 中 Promise 和 Async/Await 的区别

2025年2月21日 | 阅读 4 分钟

Promise 使用 .then().catch() 方法来处理异步操作和链式调用,而 async/await 则使用更易读、类似同步的语法来管理异步代码,并使用 try/catch 来处理错误。

在 Node.js 中,异步编程对于非阻塞操作是必要的。Promise 和 async/await 是管理异步代码的两种重要技术,它们各有自己的语法。Node.js 中的异步操作必须得到有效处理,Promise 和 async/await 是实现这一目标的主要机制。它们是通向同一目标的两种途径,使异步代码更易于管理。但它们的区别在于所使用的语法和技术不同。

Node.js 中的 Promise 是什么?

在 Node.js 中,promise 是一个对象,它代表异步操作未来成功或失败的结果,以及它产生的值。Promise 是管理异步操作的更优于回调函数的方法。它们传达的值可能立即出现,也可能稍后出现,或者根本不出现。

语法

它具有以下语法:

Promise 的主要特性

Promise 可能处于三种状态之一

  • Pending: 初始状态为 pending,表示尚未 fulfilled 或 rejected。
  • Fulfilled: 操作已成功完成。
  • Rejected: 操作失败。

方法

  • then(): 当 promise fulfilled 时,它将被执行。
  • Catch(): 当 Promise 被 rejected 时调用。
  • Finally(): 无论 Promise 的结果如何都会运行。

示例

让我们看一个例子来说明 Node.js 中的 Promise

输出

 
Data fetched using Promises: {
  userId: 1,
  id: 1,
  title: 'delectus aut autem',
  completed: false
}   

Node.js 中的 Async/Await 是什么?

Async/await 是 Promises 的语法糖,它允许我们以同步方式编写异步代码。Async/await 是建立在 Promises 之上的语法糖,在 ES2017 中引入。它允许异步代码以同步方式编写,使其更容易阅读和维护。

语法

它具有以下语法:

主要特点

Promise 是 async 函数返回的内容。它允许在内部使用 await 关键字。Await 会暂停异步函数的执行,直到返回的 promise fulfilled 或 rejected,这类似于同步代码中使用 try/catch 处理错误的方式。默认情况下,await 会在 promise 解析或拒绝之前停止函数的执行,从而简化了对控制流的跟踪,就像它是阻塞代码一样。异步代码的实现看起来不像异步代码,更容易阅读。

示例

让我们看一个例子来说明 Node.js 中的 Async/Await。

输出

 
Data fetched using async/await: {
  userId: 1,
  id: 1,
  title: 'delectus aut autem',
  completed: false
}   

Node.js 中 Promise 和 Async/Await 的主要区别

Difference between Promise and Async/Await in Node.js

Promise 和 Async/Await 在 Node.js 中有几个区别。一些主要区别如下:

PromiseAsync/Await
Promise 是一个对象,表示操作的中间状态,并保证在将来的某个时候完成。Async/Await 是 promises 的语法糖,是一个包装器,允许代码更同步地运行。
Promise 分为三种状态:resolved、rejected 和 pending。它没有状态。它返回一个 fulfilled 或 rejected 的 promise。
如果函数 "fxn1" 要在 promise 之后运行,则 promise.then(fxn1) 会将 fxn1 调用添加到回调链中,然后继续当前函数的执行。如果函数 "fxn1" 要在 await 之后执行,则 await X() 会暂停当前函数的执行并执行 fxn1。
错误由 .then() 和 .catch() 方法处理。错误处理方法是 .try() 和 .catch()。
有时 promise 链难以理解。与 promise 链相比,使用 Async/Await 使程序流更容易阅读和理解。

结论

总之,Node.js 中的异步操作都可以由 Promises 和 async/await 来处理,它们都是有效的工具。总的来说,async/await 提供了一种更直接的方式来构建可能变得繁琐的异步代码,尤其是在工作流复杂的情况下。