Promise 中的 finally() 方法详解

阅读时长 4 分钟读完

随着前端开发的发展,异步操作越来越常见。Promise 是一种非常常见的异步处理方式。在使用 Promise 的过程中,我们经常会遇到需要在 Promise 完成之后执行一些操作的情形。这时候我们可以使用 Promise 中的 finally() 方法来实现。

finally 方法简介

finally() 方法无论 Promise 是完成态还是拒绝态都会触发,它的执行结果会传递给下一个 Promise。在 finally() 方法内部,我们可以执行一些善后工作,比如清除一些数据,释放资源等等。

用法

finally() 方法的用法非常简单,只需要在 Promise 实例的后面直接调用即可,如下所示:

实例分析

为了更好地理解 finally() 方法,我们可以看看下面这个例子:

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

代码中假设有一个异步函数 asyncFunc(),它会在 1 秒钟之后返回一个成功的 Promise,接着我们在 then() 方法中打印出成功的返回值,在 catch() 方法中打印出错误信息,在 finally() 方法中打印出结束的信息。

因为 asyncFunc() 是一个成功的 Promise,所以我们在控制台中会依次看到以下输出:

值得注意的是,如果我们在 finally() 方法内部返回一个 Promise,那么 finally() 方法就相当于返回了一个新的 Promise,这会导致下面的 then() 方法会等到 finally() 方法内部的 Promise 执行完毕之后才会执行。

应用场景

  1. 清除 Loading 状态或者一些临时数据

Promise 可以很方便地处理异步请求,而在请求结束之后,我们通常需要清除一些临时数据,比如 Loading 状态、临时存放的数据等等。这时候就可以使用 finally() 方法来实现。

-- -------------------- ---- -------
-------- ------- -- -
  ----------------
  ------ -----------------------------------------
    --------- -- -
      -----------------
    --
    ---------- -- -
      ------------------
    --
    ----------- -- -
      -----------------
      ---------------
    --
-
  1. 清除定时器和释放资源

在一些需要使用定时器的场景下,我们需要在结束时清除定时器和释放资源。

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

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

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

总结

Promise 中的 finally() 方法是一个很有用的函数,它可以在任何情况下都被执行。对于一些资源释放等善后操作,都可以在这里完成。了解 finally() 的用法可以提高我们的代码质量,在开发中遇到类似的需求时可以有针对性地解决问题。

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

纠错
反馈