ECMAScript 2018:新增 Promise.prototype.{finally, try}()
简介
许多开发人员在编写 JavaScript 代码时,使用对异步操作的 Promise 返回对象。在 ECMAScript 2018 中,Promise 对象的 API 得到了增强,它们现在包括了 Promise.prototype.finally() 和 Promise.prototype.try() 方法。
Promise.prototype.finally()
Promise.prototype.finally() 实际上是个解决finally在捕获异常方面的问题。在ECMAScript 2015(ECMAScript6)标准中,Promise.prototype.then() 与 Promise.prototype.catch() 中,往往在出现异常时返回一个新的 Promise 对象。这使得开发人员需要重复编写清理逻辑,以确保代码尽早释放请在出现异常时适时中断 Promise 运行。
. then() 和 . catch() 能接收两个参数:resolve 和 reject。
finally 方法只需要传入一个回调函数,它不关心 Promise 是正常结束还是发生了异常。在 finally 回调函数中,可以关闭任何打开的文件描述符、数据库连接,或者执行任何必要的清理操作。
Promise.prototype.try()
Promise.prototype.try() 实现了异步判断,实现了错误捕捉并且返回 Promise 实例。比方说,您经常会看到类似这样的代码:
-- -------------------- ---- ------- --- ----------------- ------- -- - --- - -- ------- --- --------------- - ----- ------- - ------------- - -- ------------ -- - -------------------- --
这种模式很繁琐,很容易出错。何必要如此麻烦呢?Promise.prototype.try() 带来了一种简单的解决方案,而不会触发新的 try-catch 循环,因为它将自己隔离在一个独立的上下文中。此方法的另一个好处是,它可以在同步函数和异步函数之间自动切换,而不需要在这些函数之间切换代码。这使得代码非常灵活,容易阅读和维护。
实例展示
我们来看几个示例,以便理解这两个新方法的功能。
-- -------------------- ---- ------- ----- -------- - ------------------------------ --------------------- ----------------- ---------- -- - -- ------------------ --- - -------------------- - ------- - -- -------- ---------------------- - ------ ---- -- ---------- -- ------------------ ---------- -- ----------------- ------------ --------- ---- -------------- -- - ----------------- -- --------- -- ---------- -- - ---------------- -- ---------------- -------------- -- ----------------------- ------- - ------------ -- -------------------- ---------- -- -----------------
如上所述,Promise.prototype.finally() 是一种优雅的解决方法,可以用少量的代码清理、处理不幸发生的情况,对开发人员编写维护更高质量的代码是很有帮助的。同样的事情,Promise.prototype.try() 强大、灵活性高,并可以将编写 JavaScript 代码的体验提升到一个新的水平。
结论
Promise.prototype.finally() 和 Promise.prototype.try() 的增强,将使在异步 / Promise 编程的 JavaScript 中处理错误变得更加容易。它们的使用不仅仅是为了清理堆栈,而且用于异步异常处理也是很灵活的。尝试并了解这些新方法,以便更轻松地编写更优秀的 JS 代码。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/671896bdad1e889fe22ca6ea