ECMAScript 2018 中的 Promise 变化:返回 Promise 的 Promise 默认解包

阅读时长 5 分钟读完

Promise 简介

在前端开发中,Promise 是一种非常重要的技术,它可以很好地处理异步操作。简单来说,Promise 可以把一些异步操作封装成一个 Promise 对象,当异步操作完成时,可以用 then() 方法获取异步处理的结果。

例如,在使用 fetch() 发送一个请求时,我们可以用 then() 方法取到得到的 response。

Promise 的问题

然而,当要进行嵌套的异步处理时,问题就出现了。下面的代码尝试从服务端拿到一张图片,并进行相关处理:

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

这段代码完成了一些复杂的操作,并将处理结果展示在用户的页面上。然而,这里有一个问题:由于各个异步操作都返回了 Promise 对象,因此要对每一个 Promise 都进行一次 then() 的处理,代码显得冗长而难以理解。

Promise 的解决方案

ECMAScript 2018 中的 Promise 规范针对这个问题提出了解决方案:将返回 Promise 的 Promise 自动解包。也就是说,在以上的代码例子中,我们可以不用写 then(),这样就可以减少代码的复杂度。

修改代码如下:

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

在修改后的代码中,第二个 then() 的返回值是一个 Promise 对象。这时,原本需要使用 then() 方法进行处理的 Promise 对象可以自动解包,并直接传递到下一个 then() 方法中。这样,代码也变得更加简洁明了。

总结

ECMAScript 2018 中的 Promise 规范对前端的开发带来了非常大的帮助,将许多复杂的操作简单化了。在使用 Promise 时,我们可以更加快速、优雅地处理各种异步操作,提高代码的可读性和可维护性。

示例代码

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

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

纠错
反馈