详解 Promise 最新规范 Promise.prototype.finally

前言

随着技术的不断发展,前端领域也在不断地更新。而 Promise 已经成为了 JavaScript 中非常重要的一部分。Promise 作为一种解决异步编程的方式,极大地提高了代码的可读性和可维护性。在 ES6 发布后,Promise 随之成为了官方标准,Promise API 也得到了官方确认。

Promise.prototype.finally 是 ES2018 新增的一个方法,被认为是最具争议的一个 API 之一。在本文中,我们将深入探讨 Promise.prototype.finally 的用法、指导意义以及示例代码。

Promise.prototype.finally 的定义

Promise.prototype.finally 无论 Promise 是否成功,都会执行相应的代码,并且不会改变 Promise 状态。执行完 finally 后,将会返回原来的 Promise 对象。finally 方法有一种清理的作用,可以在它得到结果和抛出错误前,做一些额外的收尾工作。

Promise.prototype.finally 的语法

Promise.prototype.finally(successCallback[, failureCallback])

  • successCallback(仅有一个参数):将在 Promise 对象处理成功时执行的函数。该函数返回原始值或一个新的 Promise 对象。

  • failureCallback(仅有一个参数):将在 Promise 对象处理失败时执行的函数。该函数返回原始值或一个新的 Promise 对象。该参数是可选的。

请注意:finally 并不会在 catch 后面的代码执行之前执行。如果需要,在 catch 后面执行代码,仍需要在 catch 里面添加代码。

Promise.prototype.finally 的用法

finally 方法的主要作用是在 Promise 执行结束后,无论成功与否,都要执行该方法。

首先,我们来看一个简单的例子:

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

这段代码的输出结果如下:

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

可以看出,在上述代码中,finally 方法执行完毕之后,状态仍然为 resolved,因为 finally 方法不会改变 Promise 对象的状态。

除此之外,finally 还具有一个清理的作用。

例如,在创建 Ajax 请求时,我们需要在请求发送之前打开进度条,在请求返回时关闭进度条。又例如在锁定 UI 操作时,需要在 UI 解锁后执行某些特定操作。

通过 finally 方法,可以让使用 Promise 进行异步编程的前端开发人员更方便地添加类似清理的逻辑。

Promise.prototype.finally 的指导意义

Promise.prototype.finally API 的设计初衷是减少项链式 Promise 编程中常见的重复代码。某些场景下,finally 的使用确实非常恰当。

例如,在一个 Promise 任务中,我们需要清除某个外部的状态(例如是否已经取消请求、是否重置等)。假设我们已经将这个状态保存在某个位置,当前 Promise 任务完成后,我们需要设置这个状态为 false。从代码的技术角度来说,最好的做法是调用 Promise.finally() 执行此操作:

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

在实践过程中,finally API 可以与 try/catch/finally 结构结合使用。

假设我们需要关注的情况是所请求的数据是否正确。由于在错误处理(catch)和成功处理(then)中均需要处理相关逻辑,但在两个回调函数中的代码是相同的。如果不使用 finally,就需要将相同的代码添加到 catch 和 then 中间。而如果使用 finally,可以将相同的操作放置在 catch 和 then 更低的位置,从而简化代码。例如:

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

结论

在 JavaScript 编程中使用 Promise 已经成为了标准的选择。而 ES2018 新增的 Promise.prototype.finally 方法,可以更方便地在 Promise 解决异步编程过程中添加清理逻辑。同时,finally 支持在所有情况下使用,从而为应用程序添加更多的可靠性和优秀的代码可读性。

好了,这就是本文的全部内容,希望对大家在学习前端编程技术中有所帮助。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/67061680d91dce0dc85809d5