返回

初识 Promise 3 态:Promise入门快速手册

前端

大家好,欢迎来到我的技术博客。今天,我们来聊聊JavaScript中非常重要的一个概念——Promise。Promise,中文译为“承诺”,在JavaScript中,Promise是一个对象,它代表了一个异步操作的最终完成或失败的结果。Promise有三种状态:pending、resolved和rejected。

Promise的三种状态

Pending

当一个Promise对象被创建时,它的状态是pending,表示异步操作尚未完成。在这个状态下,Promise对象有两个方法:

  • then():这个方法接受两个参数,分别是成功回调函数和失败回调函数。当异步操作完成后,如果操作成功,则调用成功回调函数,如果操作失败,则调用失败回调函数。
  • catch():这个方法只接受一个参数,是一个失败回调函数。当异步操作失败时,调用失败回调函数。

Resolved

当异步操作成功完成时,Promise对象的状态变为resolved,表示操作成功。在这个状态下,Promise对象有两个方法:

  • then():这个方法只接受一个参数,是一个成功回调函数。当异步操作完成后,如果操作成功,则调用成功回调函数。
  • finally():这个方法接受一个参数,是一个finally回调函数。无论异步操作成功还是失败,都会调用finally回调函数。

Rejected

当异步操作失败时,Promise对象的状态变为rejected,表示操作失败。在这个状态下,Promise对象有两个方法:

  • catch():这个方法只接受一个参数,是一个失败回调函数。当异步操作失败时,调用失败回调函数。
  • finally():这个方法接受一个参数,是一个finally回调函数。无论异步操作成功还是失败,都会调用finally回调函数。

then()、catch()和finally()方法的使用方法

then()方法

then()方法是Promise对象最重要的一个方法。它允许您在异步操作完成后执行一些操作。then()方法接受两个参数,分别是成功回调函数和失败回调函数。当异步操作完成后,如果操作成功,则调用成功回调函数,如果操作失败,则调用失败回调函数。

const promise = new Promise((resolve, reject) => {
  // 异步操作
});

promise.then(
  (result) => {
    // 成功回调函数
  },
  (error) => {
    // 失败回调函数
  }
);

catch()方法

catch()方法是Promise对象另一个重要的一个方法。它允许您在异步操作失败时执行一些操作。catch()方法只接受一个参数,是一个失败回调函数。当异步操作失败时,调用失败回调函数。

const promise = new Promise((resolve, reject) => {
  // 异步操作
});

promise.catch((error) => {
  // 失败回调函数
});

finally()方法

finally()方法是Promise对象新增的一个方法。它允许您在异步操作完成后,无论操作成功还是失败,都执行一些操作。finally()方法接受一个参数,是一个finally回调函数。无论异步操作成功还是失败,都会调用finally回调函数。

const promise = new Promise((resolve, reject) => {
  // 异步操作
});

promise.finally(() => {
  // finally回调函数
});

Promise.all和Promise.race

Promise.all

Promise.all()方法用于将多个Promise对象组合成一个新的Promise对象。当所有传入的Promise对象都成功完成后,Promise.all()方法返回一个新的Promise对象,该对象的resolve()方法的参数是一个数组,其中包含了所有传入Promise对象成功的返回值。如果任何一个传入的Promise对象失败,Promise.all()方法返回一个新的Promise对象,该对象的reject()方法的参数是第一个失败的Promise对象的失败原因。

const promise1 = new Promise((resolve, reject) => {
  // 异步操作1
});

const promise2 = new Promise((resolve, reject) => {
  // 异步操作2
});

const promise3 = new Promise((resolve, reject) => {
  // 异步操作3
});

Promise.all([promise1, promise2, promise3])
  .then((result) => {
    // 所有Promise对象都成功完成
  })
  .catch((error) => {
    // 任何一个Promise对象失败
  });

Promise.race

Promise.race()方法用于将多个Promise对象组合成一个新的Promise对象。当任何一个传入的Promise对象完成时,Promise.race()方法返回一个新的Promise对象,该对象的resolve()方法的参数是第一个完成的Promise对象的返回值。如果所有传入的Promise对象都失败,Promise.race()方法返回一个新的Promise对象,该对象的reject()方法的参数是第一个失败的Promise对象的失败原因。

const promise1 = new Promise((resolve, reject) => {
  // 异步操作1
});

const promise2 = new Promise((resolve, reject) => {
  // 异步操作2
});

const promise3 = new Promise((resolve, reject) => {
  // 异步操作3
});

Promise.race([promise1, promise2, promise3])
  .then((result) => {
    // 任何一个Promise对象完成
  })
  .catch((error) => {
    // 所有Promise对象都失败
  });

Promise在异步编程和并发编程中的应用

Promise在异步编程和并发编程中非常有用。它可以帮助您轻松地处理异步操作,并实现并发编程。

异步编程

Promise可以帮助您轻松地处理异步操作。您可以使用then()方法在异步操作完成后执行一些操作。例如,您可以使用then()方法在AJAX请求完成后更新网页内容。

const request = new XMLHttpRequest();

request.open('GET', 'https://example.com/api/data');

request.onload = function() {
  if (request.status === 200) {
    const data = JSON.parse(request.responseText);
    // 使用then()方法更新网页内容
    updateWebpage(data);
  }
};

request.send();

并发编程

Promise也可以帮助您实现并发编程。您可以使用Promise.all()方法或Promise.race()方法将多个异步操作组合成一个新的Promise对象。当所有异步操作都完成后,您可以使用then()方法执行一些操作。例如,您可以使用Promise.all()方法并行执行多个AJAX请求,并在所有请求完成后更新网页内容。

const requests = [];

for (let i = 0; i < 10; i++) {
  requests.push(
    new Promise((resolve, reject) => {
      const request = new XMLHttpRequest();

      request.open('GET', `https://example.com/api/data/${i}`);

      request.onload = function() {
        if (request.status === 200) {
          const data = JSON.parse(request.responseText);
          resolve(data);
        } else {
          reject(new Error('请求失败'));
        }
      };

      request.send();
    })
  );
}

Promise.all(requests)
  .then((data) => {
    // 所有请求都成功完成
    updateWebpage(data);
  })
  .catch((error) => {
    // 任何一个请求失败
    console.error(error);
  });

总结

Promise是一个非常强大的工具,它可以帮助您轻松地处理异步操作和实现并发编程。如果您想学习JavaScript异步编程和并发编程,那么Promise是一个必学的基础知识。