在 ES2018 中,Promise.prototype
增加了一个新方法 finally()
,该方法会在 Promise 状态不管是 resolved 还是 rejected 都会执行。在 Promise 响应结束时,finally()
回调函数将会被执行。这个回调函数可以被执行的时候,不在乎 Promise 处理的状态。finally()
方法返回一个 Promise,因此它可以被链式调用在 Promise 对象的末尾。
用法
finally()
方法接收一个回调函数作为参数。在 Promise 结束后不管是 resolved 还是 rejected,这个回调函数都会被调用。回调函数不接收任何参数。在执行完回调函数之后,finally()
方法返回原来的 Promise,使得我们可以轻松地从 Promise 的任意一个状态执行一下行动。
promise .then(result => { /* process the result */ }) .catch(error => { /* handle the error */ }) .finally(() => { /* close the DB connection, network closings etc. */ });
在这个例子中,我们在完成处理之后会关闭数据库,关闭网络连接等。这是很好的使用场景。因为如果我们将连接打开着而没有使用它可能会导致缺乏资源,例如群集连接。
-- -------------------- ---- ------- -------- ----------------- - ----- ------- - --- ----------------- ------------------- ----- -------------------- - ------- --------------- ------ --- ----------------- ------- -- - -------------- - -- -- - -- --------------- --- ---- - -------------------------- - ---- - ---------------------------------- - -- --------------- - -- -- - --------------------- --------- -- -- ----------- -- -------------------- -------- -------------- -
在这个例子中,我们将 Finally 链接上一个 HTTP 请求。我们在成功或者失败的情况下都打印日志信息。通过这种方式,我们可以很好地了解足够的调试信息。
用途
清理
有时在 promise 链式调用结束后需要执行一些特定行动。Finally 确保在这种情况下始终会执行的软件代码。例如,我们可以打开文件做很多处理,然后最终写回文件。在这个过程中,我们需要始终确保文件被关闭。这里 finally 很有用。
同一 Group 的处理
在链式操作中我们可以将多个处理放置在同一个 group 中。例如,当我们将一个文件上传到远程服务器时,在数据传输期间,打开数据库连接并将数据存储到服务器上。在这个过程中,我们需要为所有这些处理程序定义一个组,以便在完成执行之后可以对他们进行处理。
监视
在处理数据时,我们需要在每一个阶段监控操作状态。例如,在 AJAX 请求期间,我们需要记录我们是否处于请求开始、成功、失败的状态。同样,在这个过程中可以使用 Finally 功能。
建议
Finally 可以将 promise 链项终止的成功或失败情况的观察者链接到 promise 对象后面。这为我们提供了一个机会,以确保我们在成功或失败情况下始终执行我们预期的操作。无论我们处于哪个阶段。
promise .then(result => { /* process the result */ }) .catch(error => { /* handle the error */ }) .finally(() => { /* cleanup the resource whether the Promise is resolved or rejected */ });
总结
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