ES2018 之 Promise.prototype.finally()

阅读时长 6 分钟读完

在 ES2018 中,Promise.prototype 增加了一个新方法 finally(),该方法会在 Promise 状态不管是 resolved 还是 rejected 都会执行。在 Promise 响应结束时,finally() 回调函数将会被执行。这个回调函数可以被执行的时候,不在乎 Promise 处理的状态。finally() 方法返回一个 Promise,因此它可以被链式调用在 Promise 对象的末尾。

用法

finally() 方法接收一个回调函数作为参数。在 Promise 结束后不管是 resolved 还是 rejected,这个回调函数都会被调用。回调函数不接收任何参数。在执行完回调函数之后,finally() 方法返回原来的 Promise,使得我们可以轻松地从 Promise 的任意一个状态执行一下行动。

在这个例子中,我们在完成处理之后会关闭数据库,关闭网络连接等。这是很好的使用场景。因为如果我们将连接打开着而没有使用它可能会导致缺乏资源,例如群集连接。

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

在这个例子中,我们将 Finally 链接上一个 HTTP 请求。我们在成功或者失败的情况下都打印日志信息。通过这种方式,我们可以很好地了解足够的调试信息。

用途

清理

有时在 promise 链式调用结束后需要执行一些特定行动。Finally 确保在这种情况下始终会执行的软件代码。例如,我们可以打开文件做很多处理,然后最终写回文件。在这个过程中,我们需要始终确保文件被关闭。这里 finally 很有用。

同一 Group 的处理

在链式操作中我们可以将多个处理放置在同一个 group 中。例如,当我们将一个文件上传到远程服务器时,在数据传输期间,打开数据库连接并将数据存储到服务器上。在这个过程中,我们需要为所有这些处理程序定义一个组,以便在完成执行之后可以对他们进行处理。

监视

在处理数据时,我们需要在每一个阶段监控操作状态。例如,在 AJAX 请求期间,我们需要记录我们是否处于请求开始、成功、失败的状态。同样,在这个过程中可以使用 Finally 功能。

建议

Finally 可以将 promise 链项终止的成功或失败情况的观察者链接到 promise 对象后面。这为我们提供了一个机会,以确保我们在成功或失败情况下始终执行我们预期的操作。无论我们处于哪个阶段。

总结

Promise.prototype.finally() 方法为 Promise 的状态的变化提供了一种更加容易的方法,并可以在 promise 生命周期的不同阶段使用它。我们可以用来清理、监视和在 promise 链中创建一个只用于 handleError()、handleSuccess() 和 handleComplete() 的组,并且代码可以比以前更简单、更可读。如果你还没有开始使用 Promise.prototype.finally(),那么值得尝试。

示例

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

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

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

在上面的示例中,第一个 Promise 是 resolve。然而,第二个 Promise 是 reject。在 then 和 catch 块之后,finally 块将被调用并打印一条消息到控制台,表示完成。

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

纠错
反馈