在 ES8 中,Promise 的静态方法新增了 finally 方法,该方法可以在一个 Promise 完成、拒绝后,无论结果如何,都会执行一段代码。这对于最终清理工作和避免重复代码非常有用。本文将详细解析 finally 方法的使用方法和指导意义。
finally 方法介绍
finally 方法是 Promise 构造函数的一个静态方法,它接受一个函数作为参数,在 Promise 完成或拒绝后被调用,无论 Promise 最终的状态如何。这个函数不接受参数。
以下是 finally 方法的语法:
Promise.finally(onFinally);
finally 方法的作用
finally 方法可以在 Promise 执行完毕后执行一段代码。无论 Promise 是 resolved 还是 rejected,这个处理程序都会被调用一次,以执行在 Promise 结束后的收尾工作,例如清理资源、更新 UI 界面等。
当我们在处理 Promise 链时,可能需要在其中某个步骤时进行一些清理工作。比如,在将结果展示给用户之前需要关闭一些资源,如果 Promise 链在后面还有其它操作需要执行,则需要在这些操作执行之前关闭资源。使用 finally 方法可以简单地将这些清理操作封装在一起,以便在 Promise 执行完毕时自动清理。
finally 方法的返回值
finally 方法返回一个 Promise 对象,原始 Promise 对象的值不会受到影响。通常,final 功能处理程序不会返回任何值,但是如果处理程序返回一个 Promise,则会等待该 Promise 结束后再继续执行。
在以下示例中,promise2 不会接收到任何值:
const promise1 = new Promise((resolve, reject) => { resolve('成功'); }); const promise2 = promise1.finally(() => { console.log('总是会被执行'); });
在以下示例中,promise2 将接收到 resolved 的值:
-- -------------------- ---- ------- ----- -------- - --- ----------------- ------- -- - -------------- --- ----- -------- - ------------------- -- - ---------------------- ------ ------------------- -------- ----- --- -------------------- -- - -------------------- -- ---- ---展开代码
finally 方法的正确使用方式
在实践中使用 finally 方法需要注意一些细节。以下是一些示例用法。
清理工作
在资源释放方面,finally 方法是非常有用的。例如,当我们使用 fetch 函数进行 AJAX 调用时,我们需要确保在得到响应对象并处理它之后,关闭 response 对象以释放资源。我们可以使用 finally 方法来清除这个对象:
fetch('https://jsonplaceholder.typicode.com/users') .then(response => response.json()) .then(data => console.log(data)) .finally(() => console.log('关闭资源'));
合并 finally
在 promise 链中,可能会有多个 finally 方法,如果它们的处理程序相同,则可以使用 Promise.prototype.finally() 方法来避免重复。使用此方法可以将 finally 方法添加到一个 Promise 链的末尾,将它们合并到一个处理程序中:
-- -------------------- ---- ------- ----- ----------- - -- -- ---------------------- -- - ------------------------- --- --------------------- -- - ------------------ -- -- -- - ------------------ ---展开代码
异常处理
finally 方法不会改变 Promise 对象的状态或值,但在代码中使用 finally 方法时,需要注意代码缩进。如果 finally 方法中抛出了异常,则可能会中断代码的执行。因此,在确保最后一定会返回 Promise 对象之前,请小心检查代码:
-- -------------------- ---- ------- --- ----------------- ------- -- - --- - ----- --- ------------ - ----- --- - ---------- - -- ----------- -- - ------------------------- ----- --- -------- ------- --------- -- -------- -- --------------------------展开代码
在这个示例中,finally 方法中发生了一个错误,但在 .catch() 中捕获了这个错误并正确地处理了。当然,在生产代码中,可能会有更复杂的处理方式。
迁移到 ES8 的建议
如果您想开始使用 ES8 中的静态 finally 方法,请注意以下提示:
- 检查您的 JavaScript 引擎是否支持 ES8。
- 检查您的代码是否需要支持较早的浏览器。在这种情况下,您需要使用 transpiler 或 Babel 转换器等工具。
- 如果您仅需要 finally 方法,最好使用 es6-promise 库中的 polyfill。
结论
ES8 中引入的 finally 方法是 Promise 构造函数的一个静态方法,用于在 Promise 完成或拒绝后执行回调函数。此外,finally 方法返回的 Promise 对象将不受影响,并且根据原始 Promise 对象的状态接收相应的解决或拒绝值。
finally 方法为您提供了在 Promise 执行结束后执行收尾操作的可能性,有助于代码的简化和代码复用。同时,在使用 finally 方法时,需要注意这个方法的正确使用方式,尤其是资源释放和异常处理。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6720c56a2e7021665e040643