什么是Promise?

Promise是一种异步编程的解决方案,它可以让我们更加优雅地处理异步操作。Promise有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。当Promise处于pending状态时,我们可以注册回调函数来处理Promise的结果。当Promise状态变为fulfilled或rejected时,Promise会调用相应的回调函数。

Promise的基本用法

我们可以使用Promise构造函数来创建一个Promise对象。Promise构造函数接受一个函数作为参数,这个函数又接受两个参数:resolve和reject。当异步操作成功时,我们可以调用resolve函数来将Promise状态设置为fulfilled;当异步操作失败时,我们可以调用reject函数来将Promise状态设置为rejected。

const promise = new Promise((resolve, reject) => {
  // 异步操作
  if (异步操作成功) {
    resolve(异步操作结果);
  } else {
    reject(错误信息);
  }
});

我们可以使用then方法来注册Promise状态变为fulfilled时的回调函数,使用catch方法来注册Promise状态变为rejected时的回调函数。

promise.then((result) => {
  // 处理异步操作成功的情况
}).catch((error) => {
  // 处理异步操作失败的情况
});

Promise的链式调用

Promise的then方法和catch方法都会返回一个新的Promise对象,因此我们可以使用链式调用来处理多个异步操作。

promise
  .then((result1) => {
    // 处理异步操作1成功的情况
    return result1 + 1;
  })
  .then((result2) => {
    // 处理异步操作2成功的情况
    return result2 + 2;
  })
  .then((result3) => {
    // 处理异步操作3成功的情况
  })
  .catch((error) => {
    // 处理异步操作失败的情况
  });

Promise.all和Promise.race

Promise.all方法可以接受一个Promise对象数组作为参数,当所有Promise对象都变为fulfilled状态时,Promise.all返回一个新的Promise对象,这个新的Promise对象的状态为fulfilled,它的值是一个数组,数组中的元素是每个Promise对象的结果。

const promises = [promise1, promise2, promise3];
Promise.all(promises)
  .then((results) => {
    // 处理所有异步操作成功的情况
  })
  .catch((error) => {
    // 处理异步操作失败的情况
  });

Promise.race方法可以接受一个Promise对象数组作为参数,当其中任意一个Promise对象变为fulfilled或rejected状态时,Promise.race返回一个新的Promise对象,这个新的Promise对象的状态和值与第一个变为fulfilled或rejected状态的Promise对象相同。

const promises = [promise1, promise2, promise3];
Promise.race(promises)
  .then((result) => {
    // 处理第一个异步操作成功的情况
  })
  .catch((error) => {
    // 处理第一个异步操作失败的情况
  });

Promise的错误处理

在Promise链式调用中,如果某个then方法或catch方法抛出异常,那么后面的then方法或catch方法将不会被执行。为了避免这种情况,我们可以在每个then方法或catch方法中使用try-catch语句来捕获异常。

promise
  .then((result1) => {
    // 处理异步操作1成功的情况
    return result1 + 1;
  })
  .then((result2) => {
    // 处理异步操作2成功的情况
    return result2 + 2;
  })
  .then((result3) => {
    // 处理异步操作3成功的情况
    throw new Error('出错了');
  })
  .catch((error) => {
    // 处理异步操作失败的情况
    console.error(error);
  });
文章目录