📜  在 js 中最终承诺 - Javascript (1)

📅  最后修改于: 2023-12-03 14:50:57.994000             🧑  作者: Mango

在 JavaScript 中最终承诺 - Promise

JavaScript 中的 Promise 是一种很有用的异步编程模型,它可以帮助我们更好地处理异步代码,使得代码更加清晰和易读。

什么是 Promise

Promise 是一种代表了异步操作的最终结果的对象。它能够在异步操作完成后返回结果或错误。Promise 对象具有以下三种状态:

  • Pending(进行中):初始状态,既没有被完成也没有被拒绝。
  • Fulfilled(已完成):操作成功完成,返回了结果。
  • Rejected(已拒绝):操作失败,返回了错误信息。
Promise 的使用

我们可以使用 Promise 来处理异步操作。比如,从服务器获取数据等等。Promise 可以链式调用,以避免回调地狱。

const promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve("Success!"); // 完成
  }, 1000);
});

promise.then((result) => {
  console.log(result); // Success!
}).catch((error) => {
  console.log(error);
});

以上代码创建了一个 Promise 对象,1 秒后返回一个成功信息。该 Promise 对象返回了一个成功信息,再通过 .then() 方法来获取结果。

Promise 的链式调用

Promise 支持链式调用,如果我们在一个 Promise 中返回了另一个 Promise,那么后续的 Promise 将会等到前一个 Promise 完成后才会执行。我们可以通过 .then() 方法来继续处理 Promise 返回的结果。

const promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve("Success!");
  }, 1000);
});

promise.then((result) => {
  console.log(result); // Success!
  return "Another Promise";
})
.then((result) => {
  console.log(result); // Another Promise
})
.catch((error) => {
  console.log(error);
});

其中第一个 .then() 返回了另一个 Promise 对象,第二个 .then() 将等到这个 Promise 完成后才会执行。

Promise 的错误处理

当 Promise 被拒绝时,我们可以使用 .catch() 进行错误处理。.catch() 方法接收一个回调函数,当 Promise 被拒绝时将执行该回调函数。

const promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    reject("Error!");
  }, 1000);
});

promise.then((result) => {
  console.log(result); // 不会执行
})
.catch((error) => {
  console.log(error); // Error!
});
Promise.all()

Promise.all() 方法可以用于等待多个 Promise 完成并返回它们的结果。当所有的 Promise 都完成时,它将以一个结果数组调用 .then() 方法。如果有任意一个 Promise 被拒绝了,则 .catch() 方法将会被调用。

const promise1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve("Promise 1");
  }, 1000);
});

const promise2 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve("Promise 2");
  }, 2000);
});

const promise3 = new Promise((resolve, reject) => {
  setTimeout(() => {
    reject("Error");
  }, 3000);
});

Promise.all([promise1, promise2, promise3])
.then((result) => {
  console.log(result); // 不会执行
})
.catch((error) => {
  console.log(error); // Error
});
总结

Promise 可以帮助我们更好地处理异步代码,使得代码更加清晰和易读。我们可以使用 .then().catch() 来处理 Promise 返回的结果和错误信息。此外,我们可以使用 .all() 方法等待多个 Promise 完成并返回它们的结果。