Promises和async/await 分别是什么,如何使用,作用是什么

98 阅读2分钟

Promises 和 async/await 都是 JavaScript 中处理异步操作的手段,它们使得异步代码的编写和理解变得更加容易。

Promises

定义: Promise 是一个代表异步操作最终完成或失败的对象。它有三种状态:

  • Pending(进行中):初始状态,既不是成功,也不是失败状态。
  • Fulfilled(已成功):意味着操作成功完成。
  • Rejected(已失败):意味着操作失败。

使用方式

// 创建一个新的Promise
const myPromise = new Promise((resolve, reject) => {
  // 异步操作
  setTimeout(() => {
    const result = 'Success!';
    resolve(result); // 操作成功时调用
    // reject('Error!'); // 操作失败时调用
  }, 1000);
});

// 处理Promise的结果
myPromise.then((value) => {
  console.log(value); // 处理成功的结果
}).catch((error) => {
  console.error(error); // 处理失败的错误
});

作用

  • 使异步代码以一种更线性的方式书写,避免了回调地狱(callback hell)。
  • 提供了统一的错误处理方式。

async/await

定义asyncawait 是建立在 Promise 之上的两个关键字,用于简化异步代码的编写。

  • async:用于声明一个函数是异步的,这样的函数总是会返回一个 Promise。
  • await:用于等待一个 Promise 解决(fulfilled),在等待期间暂停异步函数的执行。

使用方式

// 声明一个异步函数
async function asyncFunction() {
  try {
    // 等待一个Promise
    const result = await myPromise;
    console.log(result); // 'Success!'
  } catch (error) {
    console.error(error); // 处理错误
  }
}

// 调用异步函数
asyncFunction();

作用

  • 使得异步代码的写法更接近于同步代码,提高了可读性和可维护性。
  • 通过 try...catch 结构简化了错误处理。

区别和使用场景

  • 可读性async/await 通常被认为比传统的 Promise 链更易于理解。
  • 错误处理:使用 async/await 可以更自然地使用 try...catch 进行错误处理,而 Promise 需要链式调用 .catch()
  • 嵌套async/await 可以减少深层嵌套的异步调用,而 Promise 链可能会变得复杂。
  • 性能:在性能上两者差异不大,因为 async/await 本质上也是返回一个 Promise。

通常,推荐在可能的情况下使用 async/await,因为它的代码更简洁、更易于理解。然而,在某些情况下,例如需要并行处理多个异步操作时,传统的 Promise 链或 Promise.all 可能更合适。