在 ES9 中,Promise 增加了一个新的实例方法 Promise.prototype.finally()。这个方法在 Promise 完成后,不论 Promise 的状态是成功还是失败,在 Promise 返回结果前都会执行,用于执行一些清理操作或者设置最终状态。
ES9 中,Promise.prototype.finally() 方法可以在 Promise 链中的任何位置使用,并返回一个 Promise 对象,这个 Promise 对象的状态和值与原 Promise 对象保持一致。
Promise.prototype.finally() 方法语法
Promise.prototype.finally() 方法的语法如下:
promiseInstance .finally(function () { // 执行清理操作或者设置最终状态 })
Promise.prototype.finally() 方法返回值
Promise.prototype.finally() 方法返回一个 Promise 对象,这个 Promise 对象的状态和值与原 Promise 对象保持一致。
无论 Promise 对象成功或者失败,Promise.prototype.finally() 方法都会在最后执行,并返回一个新的 Promise 对象。
如果 Promise.prototype.finally() 方法中抛出了一个错误,会将原来的 Promise 对象的状态改为 reject,且 reject 的值就是抛出的错误信息。如果没有抛出错误,则原来的 Promise 对象状态不变。
下面我们看一下具体的使用示例。
Promise.prototype.finally() 方法使用示例
-- -------------------- ---- ------- -------- ------------- - ------ --- ----------------- ------- -- - ----- --------- - ------------------------ - ---- -- ---------- - -- - ------------------- --------------- - ---- - ------------------ --------------- - --- - ------------- ------------- -- - -------------------- -- -------- ---- - - ------- -- -------------- -- - -------------------- -- -------- ---- - - ------- -- ----------- -- - -------------------- -- ------------- ---
在上面的示例中,我们使用 Promise 实例的 then 和 catch 方法处理 Promise 的成功或者失败,同时使用 Promise.prototype.finally() 方法对代码进行清理操作或者设置最终状态。
如果我们运行程序,会随机的生成一个数字,如果数字大于 5,Promise 对象就会 resolved,否则就会 rejected。不论 Promise 最后的状态是成功还是失败,Promise.prototype.finally() 方法都会在最后执行,并返回一个新的 Promise 对象。我们看到最终的控制台输出如下:
// randomNum: 1 // Promise is rejected with randomNum: 1 // Promise is completed.
注意到,这里仅仅是把 Promise 对象在 then 和 catch 中的状态打印出来,实际生产环境中可能有其它一些稍显复杂的操作,但读者可以根据自己的业务场景进行相应的扩展。
总结
在 ES9 中,Promise.prototype.finally() 方法作为一个典型的方法促进了对异步编程的进一步优化。通过这个方法,我们可以完成更多的清理操作和设置最终状态,清晰利用了 Promise 链式结构的特点,提高代码可读性及可维护性。
在使用 Promise.prototype.finally() 方法时,我们必须注意,它使用时的语法和一些注意事项,这样才能在实际生产环境中更好地使用和维护代码。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64f7c493f6b2d6eab3ff538e