彻底理解 Promise 的三种状态

· 约 7 分钟读完

Promise 是处理异步任务时非常常见的一种技术,通过 Promise 能够更好地组织异步代码,提升代码可读性和可维护性。Promise 可以处于三种状态:Pending(等待中)、Fulfilled(成功)和Rejected(失败),其中的状态转换是非常重要的。本文将详细介绍 Promise 的三种状态,以及状态转换的相关知识,帮助大家更好地理解 Promise 的机制。

Promise 状态

1. Pending 状态

当一个 Promise 实例被创建时,它首先处于 Pending 状态。这就意味着该 Promise 实例既不是 Fulfilled 也不是 Rejected。此时,Promise 实例尚未成功或失败,而是在等待异步操作的结果。

下面是一个例子,此时的 Promise 实例就处于 Pending 状态:

2. Fulfilled 状态

当 Promise 实例成功完成异步任务并返回结果时,它就进入了 Fulfilled 状态。在 Fulfilled 状态下,Promise 实例可以提供异步操作返回的结果。

下面是一个例子,此时的 Promise 实例就处于 Fulfilled 状态:

3. Rejected 状态

当 Promise 实例在异步任务期间发生错误时,它就进入了 Rejected 状态。在 Rejected 状态下,Promise 实例可以提供异步操作返回的错误信息。

下面是一个例子,此时的 Promise 实例就处于 Rejected 状态:

状态转换

Promise 实例会在 Pending、Fulfilled 和 Rejected 状态之间进行状态转换。Promise 能够接受两个参数,resolve 和 reject,它们分别表示异步操作成功和失败。当异步操作成功时,Promise 将从 Pending 转变为 Fulfilled;而在异步操作失败时,Promise 将从 Pending 转变为 Rejected。

下面是一个例子,我们使用 setTimeout 模拟异步操作:

在这个例子中,我们使用 setTimeout 模拟一个异步操作,并在 1 秒后使用 resolve 将 Promise 实例从 Pending 转变为 Fulfilled 状态。在这之后,我们的 then 方法就会触发并输出 success!

如果异步操作出现异常,则会进入 Rejected 状态:

在这个例子中,我们使用 reject 将 Promise 实例从 Pending 转变为 Rejected 状态。在这之后,我们的 catch 方法就会触发并输出错误信息 An error occurred!。

Promise.all 和 Promise.race

Promise.all 返回一个 Promise 实例,该 Promise 实例在数组中的所有 Promise 都变为 Fulfilled 后变为 Fulfilled。如果数组中的一个 Promise 进入 Rejected 状态,则 Promise.all 返回的 Promise 也会进入 Rejected 状态。下面是一个例子:

在这个例子中,我们使用 Promise.all 把多个 Promise 实例组合成一个新的 Promise 实例并运行。如果所有的实例都成功,则新的 Promise 实例将进入 Fulfilled 状态并返回所有实例的结果;如果其中任何一个实例进入 Rejected 状态,则新的 Promise 实例也会进入 Rejected 状态并返回错误信息。

而 Promise.race 返回一个 Promise 实例,它在数组中的任何一个 Promise 转换为 Fulfilled 或 Rejected 后便会立即返回相关信息。下面是一个例子:

在这个例子中,我们使用了 Promise.race 的静态方法,并把 promise1 和 promise2 实例作为参数。在这个例子中,promise2 实例比 promise1 更快,所以 Promise.race 就会返回 promise2 的结果 two。

本文详细讲解了 Promise 的三种状态和状态转换机制,希望能对大家有所帮助。为了更好地使用 Promise 技术,我们需要理解 Promise 的机制以及状态转换过程。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d81617a941bf7134e7321e