📜  Node.js 中的 promise 和 async await 的区别(1)

📅  最后修改于: 2023-12-03 15:17:56.663000             🧑  作者: Mango

Node.js 中的 promise 和 async/await 的区别

Node.js 是一个基于事件驱动、非阻塞 I/O 的平台,开发者经常会使用回调函数进行异步编程。然而回调地狱(Callback Hell)使代码可读性和可维护性变差。Promise 和 async/await 是一些解决回调地狱的方式。

Promise

Promise 是 ECMAScript 6 中的一种异步编程的解决方案。它可以避免回调地狱,链式调用更加优雅。

// Promise示例
function getData() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve('success')
    }, 1000)
  })
}

getData()
  .then(result => {
    console.log(result) // success
  })
  .catch(error => {
    console.log(error)
  })

Promise 有三种状态:pending、fulfilled、rejected。当状态从 pending 转变为 fulfilled 或 rejected 时,称为 settled。

优点:

  • 避免了回调地狱
  • 可以处理异步操作完成或失败后的结果
  • 可以在多个 Promise 之间等待或者组合结果

缺点:

  • 需要写更多的代码,可读性变差
async/await

async/await 是建立在 Promise 上的一种异步编程方式,它可以减少 Promise 冗长的代码和难懂的语法结构。

// async/await 示例
function getData() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve('success')
    }, 1000)
  })
}

async function test() {
  const result = await getData()
  console.log(result) // success
}

test()

优点:

  • 可读性更高,语法更加简洁
  • 可以像同步代码一样捕获错误
  • 可以方便地使用 try/catch 进行异常处理

缺点:

  • 需要新版本的 Node.js 支持
  • 无法在 for 循环中使用 async/await,因为它会阻塞主线程
  • await 只能在 async 函数中使用
总结

Promise 和 async/await 都是解决回调地狱问题的方式。使用 async/await 可以让你的代码简洁、易读和可维护,但需要注意一些使用限制。而 Promise 则可以更加灵活地处理异步操作完成或失败后的结果。根据实际需要,在两种方式中选择适合自己的。