Promise是什么

4 阅读2分钟

Promise 是 JavaScript 中用于处理异步操作的对象,它代表一个尚未完成但预期会在未来完成(或失败)的操作及其结果。

核心概念

三种状态

  1. Pending(进行中)  - 初始状态
  2. Fulfilled(已成功)  - 操作成功完成
  3. Rejected(已失败)  - 操作失败

基本语法

const promise = new Promise((resolve, reject) => {
  // 异步操作
  if (/* 操作成功 */) {
    resolve(value);  // 状态变为 fulfilled
  } else {
    reject(error);   // 状态变为 rejected
  }
});

使用方法

1. then()  - 处理成功结果

promise.then(
  (result) => {
    console.log('成功:', result);
  },
  (error) => {
    console.log('失败:', error);
  }
);

2. catch()  - 处理失败情况

promise
  .then(result => console.log(result))
  .catch(error => console.error(error));

3. finally()  - 无论成功失败都执行

promise
  .then(result => console.log(result))
  .catch(error => console.error(error))
  .finally(() => console.log('操作完成'));

实际示例

// 模拟异步请求
function fetchData() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      const success = Math.random() > 0.3;
      if (success) {
        resolve({ data: '用户数据' });
      } else {
        reject(new Error('请求失败'));
      }
    }, 1000);
  });
}

// 使用 Promise
fetchData()
  .then(response => {
    console.log('获取数据:', response.data);
    return response.data;
  })
  .catch(error => {
    console.error('错误:', error.message);
  });

Promise 的静态方法

Promise.all()  - 所有 Promise 都成功

const p1 = Promise.resolve(1);
const p2 = Promise.resolve(2);
const p3 = Promise.resolve(3);

Promise.all([p1, p2, p3])
  .then(values => console.log(values)); // [1, 2, 3]

Promise.race()  - 最先完成的 Promise

const fast = new Promise(resolve => setTimeout(() => resolve('快'), 100));
const slow = new Promise(resolve => setTimeout(() => resolve('慢'), 500));

Promise.race([fast, slow])
  .then(result => console.log(result)); // "快"

Promise.allSettled()  - 所有 Promise 都完成(无论成功失败)

Promise.any()  - 第一个成功的 Promise

链式调用(避免回调地狱)

// 回调地狱示例
doSomething(function(result) {
  doSomethingElse(result, function(newResult) {
    doThirdThing(newResult, function(finalResult) {
      console.log(finalResult);
    });
  });
});

// Promise 链式调用
doSomething()
  .then(result => doSomethingElse(result))
  .then(newResult => doThirdThing(newResult))
  .then(finalResult => console.log(finalResult))
  .catch(error => console.error(error));

为什么需要 Promise?

  1. 避免回调地狱 - 代码更扁平,易于阅读
  2. 更好的错误处理 - 统一的错误处理机制
  3. 可组合性 - 多个异步操作可以方便地组合
  4. 状态不可变 - Promise 状态一旦改变就不会再变

现代替代方案

虽然 Promise 解决了回调地狱,但 ES2017 引入了更简洁的语法:

// 使用 async/await
async function getUserData() {
  try {
    const user = await fetchUser();
    const posts = await fetchPosts(user.id);
    return { user, posts };
  } catch (error) {
    console.error('获取数据失败:', error);
  }
}

Promise 是现代 JavaScript 异步编程的基础,async/await 语法糖也是基于 Promise 实现的。