📜  承诺所有 - Javascript (1)

📅  最后修改于: 2023-12-03 15:10:06.360000             🧑  作者: Mango

承诺所有 - Javascript

什么是 Promise?

Promise 是 Javascript 中的一种设计模式,用于异步操作的管理。它是一种代表未来结果的对象,可以简化复杂的异步逻辑。

Promise 的语法

一个 Promise 包括三种状态。

  • pending (等待):初始状态,不是 fulfilled 或者 rejected。
  • fulfilled (完成):操作成功完成并返回结果,Promise 实例进入 fulfilled 状态。
  • rejected (失败):操作失败并返回错误信息,Promise 实例进入 rejected 状态。

创建 Promise 可以通过 Promise 构造函数来实现,如下所示:

const promise = new Promise((resolve, reject) => {
  // 异步操作
  // 如果操作成功,可以使用 resolve 方法返回结果
  // 如果操作失败,可以使用 reject 方法返回错误信息
});
Promise 的链式调用

使用 Promise 的一个显著的优势是可以进行链式调用。例如,我们需要依次执行三个异步操作,任意一个失败都会中断后续操作。使用 Promise 可以这样实现:

const promise = fetchData()
  .then((data1) => process1(data1))
  .then((data2) => process2(data2))
  .then((data3) => process3(data3))
  .catch((error) => handleError(error));

这个代码片段定义了一个 fetchData 方法,它返回一个 Promise 对象。接下来,每一个 then 方法都接收上一个 Promise 返回的结果作为参数,并返回一个新的 Promise 对象。

如果其中任何一个异步操作返回了错误,整个 Promise 链都会中断,并跳到 catch 方法中执行错误处理逻辑。

Promise.all

Promise.all 方法可以将多个 Promise 对象包装成一个新的 Promise 对象,等到所有 Promise 都成功完成后,才会触发新的 Promise 的 fulfilled 状态。如果其中任何一个 Promise 失败,则整个 Promise.all 直接进入 rejected 状态。

例如,我们有三个异步操作,需要等到它们全部完成才执行下一步操作。这个场景可以使用 Promise.all,如下所示:

const promises = [fetchData1(), fetchData2(), fetchData3()];

Promise.all(promises)
  .then(([data1, data2, data3]) => processData(data1, data2, data3))
  .catch((error) => handleError(error));

Promises 数组包含了三个 Promise,我们使用 Promise.all 方法将它们封装成一个新的 Promise。接下来的 then 方法接收一个包含了所有 Promise 返回结果的数组,我们可以使用数组解构将其拆分为三个变量:data1、data2 和 data3。

Promise.race

Promise.race 方法和 Promise.all 类似,都是将多个 Promise 对象包装成一个新的 Promise 对象。但不同的是,Promise.race 只等待最先结束的 Promise,无论成功或者失败。

例如,我们有两个异步操作,但我们只关心哪个先完成了。这个场景可以使用 Promise.race,如下所示:

const promises = [fetchData1(), fetchData2()];

Promise.race(promises)
  .then((result) => processResult(result))
  .catch((error) => handleError(error));

Promises 数组包含了两个 Promise,我们使用 Promise.race 方法将它们封装成一个新的 Promise。当任意一个 Promise 完成时,新的 Promise 便会 resolved,并调用 then 方法,我们可以使用 result 参数处理异步结果。

总结

Promise 是一种管理异步操作的新的设计模式。Promise 包括三种状态、链式调用、Promise.all 和 Promise.race 等方法,可以更便捷地实现回调地狱等复杂异步逻辑。