进阶 Promise

阅读时长 8 分钟读完

Promise 是 JavaScript 中处理异步编程的一种方式,它可以避免回调地狱,让代码更加清晰易读。在前端开发中,Promise 是必不可少的技术之一。本文将进一步介绍 Promise 的相关知识,让你更加深入地理解 Promise 并且能够更好地使用它。

Promise 的三种状态

Promise 有三种状态:pending、fulfilled 和 rejected。在 Promise 对象创建时,它的状态为 pending,可以通过 resolve 方法将 Promise 状态变为 fulfilled,也可以通过 reject 方法将 Promise 状态变为 rejected。

以下是一个简单的 Promise 示例:

-- -------------------- ---- -------
----- ------- - --- ----------------- ------- -- -
  ------------- -- -
    -------------------
  -- ------
---

--------------------- -- -
  -------------------- -- ---------
---------------- -- -
  -------------------
---

在上面的代码中,我们创建了一个 Promise 对象,它在 1 秒后将状态变为 fulfilled,然后通过 then 方法获取 Promise 的值并打印出来。

Promise 的链式调用

Promise 的 then 方法可以返回一个新的 Promise 对象,这样就可以进行链式调用。链式调用可以让代码更加简洁,避免了回调地狱的问题。

以下是一个 Promise 链式调用的示例:

-- -------------------- ---- -------
----- ------- - --- ----------------- ------- -- -
  ------------- -- -
    -----------
  -- ------
---

--------------------- -- -
  -------------------- -- -
  ------ ------ - --
---------------- -- -
  -------------------- -- -
  ------ ------ - --
---------------- -- -
  -------------------- -- -
---------------- -- -
  -------------------
---

在上面的代码中,我们创建了一个 Promise 对象,在第一个 then 方法中将 Promise 的值加 1,并返回一个新的 Promise 对象,然后在第二个 then 方法中将 Promise 的值再加 1,并返回一个新的 Promise 对象,最后在第三个 then 方法中打印出 Promise 的值。

Promise.all 和 Promise.race

Promise.all 和 Promise.race 是 Promise 的两个静态方法,它们可以让我们更加方便地处理多个 Promise 对象。

Promise.all 方法接收一个 Promise 对象数组作为参数,它会等待所有的 Promise 对象都变为 fulfilled 状态后,返回一个新的 Promise 对象,这个新的 Promise 对象的值是一个数组,包含了所有 Promise 对象的值。

以下是一个 Promise.all 的示例:

-- -------------------- ---- -------
----- -------- - --- ----------------- ------- -- -
  ------------- -- -
    -----------
  -- ------
---

----- -------- - --- ----------------- ------- -- -
  ------------- -- -
    -----------
  -- ------
---

----- -------- - --- ----------------- ------- -- -
  ------------- -- -
    -----------
  -- ------
---

---------------------- --------- ------------------------- -- -
  --------------------- -- --- -- --
---------------- -- -
  -------------------
---

在上面的代码中,我们创建了三个 Promise 对象,然后通过 Promise.all 方法等待它们都变为 fulfilled 状态后,打印出它们的值。

Promise.race 方法接收一个 Promise 对象数组作为参数,它会等待所有的 Promise 对象中有一个变为 fulfilled 或者 rejected 状态后,返回一个新的 Promise 对象,这个新的 Promise 对象的值是第一个变为 fulfilled 或者 rejected 状态的 Promise 对象的值。

以下是一个 Promise.race 的示例:

-- -------------------- ---- -------
----- -------- - --- ----------------- ------- -- -
  ------------- -- -
    -----------
  -- ------
---

----- -------- - --- ----------------- ------- -- -
  ------------- -- -
    -----------
  -- ------
---

----- -------- - --- ----------------- ------- -- -
  ------------- -- -
    -----------
  -- ------
---

----------------------- --------- ------------------------ -- -
  -------------------- -- -
---------------- -- -
  -------------------
---

在上面的代码中,我们创建了三个 Promise 对象,然后通过 Promise.race 方法等待它们中有一个变为 fulfilled 或者 rejected 状态后,打印出它们的值。

Promise 的错误处理

在 Promise 中,如果在链式调用中某个 Promise 对象发生了错误,可以通过 catch 方法来捕获这个错误。catch 方法返回一个新的 Promise 对象,它的状态为 rejected。

以下是一个 Promise 错误处理的示例:

-- -------------------- ---- -------
----- ------- - --- ----------------- ------- -- -
  ------------- -- -
    ----------------
  -- ------
---

--------------------- -- -
  --------------------
---------------- -- -
  ------------------- -- -------
---

在上面的代码中,我们创建了一个 Promise 对象,它在 1 秒后将状态变为 rejected,然后通过 catch 方法捕获这个错误并打印出来。

Promise 的取消

目前,JavaScript 中并没有原生的 Promise 取消机制,但是可以通过手动实现 Promise 的取消。

以下是一个手动实现 Promise 取消的示例:

-- -------------------- ---- -------
----- ----------------- -
  -------------------- -
    ------------ - --------
    --------------- - ------
  -

  -------- -
    --------------- - -----
  -

  ----------------- ----------- -
    -- ----------------- -
      ------ -----
    -
    ----- ----------- - ------------------------------ ------------
    ------ --- -------------------------------
  -

  ----------------- -
    -- ----------------- -
      ------ -----
    -
    ----- ----------- - -------------------------------
    ------ --- -------------------------------
  -
-

----- ------- - --- --------------------- ----------------- ------- -- -
  ------------- -- -
    -------------------
  -- ------
----

--------------------- -- -
  --------------------
---------------- -- -
  -------------------
---

-----------------

在上面的代码中,我们手动实现了一个 CancelablePromise 类,它包装了一个原生的 Promise 对象,并且可以通过 cancel 方法来取消这个 Promise 对象。在 then 和 catch 方法中,我们判断了当前的 Promise 对象是否已经被取消,如果已经被取消,则直接返回当前的 CancelablePromise 对象,否则将原生的 Promise 对象包装成一个新的 CancelablePromise 对象并返回。

结论

通过本文的介绍,我们可以更加深入地了解 Promise 的相关知识,包括 Promise 的三种状态、链式调用、Promise.all 和 Promise.race、Promise 的错误处理以及手动实现 Promise 的取消。掌握这些知识可以让我们更加熟练地使用 Promise,并且可以在项目中更好地处理异步编程。

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

纠错
反馈