跳到主要内容

解释什么是 JavaScript 中的承诺?

参考答案:

在 JavaScript 中,Promise 是一个用于处理异步操作的对象,它代表了一个最终可能完成(fulfilled)或失败(rejected)的异步操作及其结果值。Promise 提供了一种优雅的方式来组织和处理异步代码,避免了传统异步处理方式(如回调函数和事件监听)中常见的“回调地狱”(Callback Hell)问题。

Promise 有三个主要状态:

  1. Pending(待定):初始状态,既不是成功,也不是失败状态。
  2. Fulfilled(已实现):意味着操作成功完成。
  3. Rejected(已拒绝):意味着操作失败。

一旦 Promise 到达 Fulfilled 或 Rejected 状态,就不会再改变状态。这也是所谓的“不可变”(immutable)状态。

Promise 对象通常用于封装一个需要异步处理的操作,例如网络请求、定时器、文件读写等。在创建 Promise 对象时,通常需要传入一个执行器函数(executor function),该函数接收两个参数:resolve 和 reject,分别用于表示异步操作成功和失败时的回调函数。

Promise 对象提供了统一的 API,使得我们可以使用 .then().catch().finally() 等方法来处理异步操作的结果。这些方法可以链式调用,使得代码更加清晰易读。

例如,以下是一个使用 Promise 处理异步网络请求的示例:

const fetchData = () => {
  return new Promise((resolve, reject) => {
    // 模拟一个异步网络请求
    setTimeout(() => {
      const data = [1, 2, 3, 4, 5];
      resolve(data);
    }, 1000);
  });
};

fetchData()
  .then(data => {
    console.log('请求成功', data);
  })
  .catch(error => {
    console.log('请求失败', error);
  })
  .finally(() => {
    console.log('无论成功还是失败,都会执行 finally 中的代码');
  });

在这个示例中,fetchData() 函数返回了一个 Promise 对象。当异步网络请求成功时,Promise 对象的状态变为 Fulfilled,并调用 resolve() 方法,将获取到的数据作为参数传递给 .then() 方法中的回调函数。如果异步网络请求失败,Promise 对象的状态变为 Rejected,并调用 reject() 方法,将错误信息作为参数传递给 .catch() 方法中的回调函数。无论 Promise 对象的状态如何,.finally() 方法中的回调函数都会被执行。