在前端开发中,很多时候都需要进行异步编程,而 Promise 是一种非常流行的解决方案。ECMAScript 2017 引入了 Promise.prototype.finally() 方法,这个方法在 promise 执行结束时无论成功还是失败,可以让开发者在代码层面实现一些最终操作。
Promise.prototype.finally() 的作用
Promise.prototype.finally() 方法接受一个函数作为参数,在 Promise 状态为 fulfilled 或 rejected 时都会执行这个函数,而且无论 Promise 状态如何,finally() 方法的返回值都会是一个新的 Promise 对象。
这个新 Promise 对象的状态根据其他 Promise 对象的状态而定:
- 如果前面的 Promise 对象为 fulfilled,则 finally() 方法返回的 Promise 对象的状态也为 fulfilled。
- 如果前面的 Promise 对象为 rejected,则 finally() 方法返回的 Promise 对象的状态也为 rejected。
- 如果 finally() 方法抛出异常或返回一个 rejected 状态的 Promise 对象,则新 Promise 对象的状态也为 rejected。
通过这个方法,我们可以实现一些不管 Promise 执行结果如何都要执行的最终操作,比如清除一些资源、关闭一些持久连接等。
Promise.prototype.finally() 的用法示例
我们来看一个使用 Promise.prototype.finally() 的实际例子:
-- -------------------- ---- ------- ------------ -------------- -- - -- ---- -- ------------ -- - -- ---- -- ----------- -- - -- ------- ------------------ ----- ---展开代码
在这个例子中,我们使用 fetch() 方法获取数据。如果 fetch() 成功获取了数据,我们会在 then() 方法中进行处理;如果获取失败,我们会在 catch() 方法中处理错误。
不管 fetch() 接口的执行结果如何,我们都需要在结束时执行一些清理操作,例如记录日志或关闭连接等,那么这个时候就可以使用 finally() 方法来实现。
再来看一个例子,这个例子演示如何使用 Promise.prototype.finally() 来关闭 WebSocket 连接:
-- -------------------- ---- ------- ----- -- - --- -------------------------------------- --------- - --------------- - ---------------------- --------- -- ------------ - --------------- - ---------------------- ------------ -- ---------- - --------------- - ---------------------- --------- -- ---------- - --------------- - ---------------------- ------- -- -------------- ------------- -----------展开代码
当执行 ws.close() 方法时,WebSocket 连接就会被关闭,但是由于 WebSocket 的关闭是异步操作,因此我们需要在 WebSocket 连接关闭后才能进行一些清理工作。那么这个时候,我们可以使用 Promise.prototype.finally() 方法来实现:
-- -------------------- ---- ------- ----- -- - --- -------------------------------------- --------- - --------------- - ---------------------- --------- -- ------------ - --------------- - ---------------------- ------------ -- ---------- - --------------- - ---------------------- --------- -- ---------- - --------------- - ---------------------- ------- -- -------------- ------------- --- --------------- -- - ---------- - --------------- - ---------------------- --------- ---------- -- ------------- -- - ---------------------- ---------------- -- ----------------- ---展开代码
在这个例子中,我们创建了一个 Promise 对象,使用 resolve() 方法来设置 Promise 对象的状态为 fulfilled。在 Promise 对象的 finally() 方法中,我们可以进行一些清理工作。
当 WebSocket 连接关闭后,onclose 事件会被触发,然后我们通过 resolve() 方法来将 Promise 对象的状态设置为 fulfilled。这个时候,Promise 相关的执行完成函数就会被执行,从而可以进行一些清理工作。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d0069fe46428fe9ec85c0f