前言
JavaScript 是一门非常灵活的语言,但是它也有一些缺陷。其中一个大问题就是处理异步操作时,我们经常会遇到拒绝(rejected)的情况。在 ES6 中,我们通过 Promise 解决了这个问题。但是,即使使用 Promise,仍然会有一些问题。在 ES12 中,新增了一些新的特性来解决这些问题。本文将介绍 ES12 中的新的待处理拒绝转移的原型示例值。
什么是待处理拒绝转移?
在 Promise 中,当一个 Promise 被拒绝时,我们通常会使用 catch() 方法来处理拒绝。但是,如果我们在 catch() 方法中抛出一个错误,这个错误会被传递到下一个 catch() 方法中。这种情况下,我们称之为“待处理拒绝转移”。
以下是一个示例:
Promise.reject(new Error('something went wrong')) .catch(error => { throw new Error('oops!') }) .catch(error => { console.error(error.message) // "oops!" })
在这个示例中,我们在第一个 catch() 方法中抛出了一个错误。这个错误被传递到了第二个 catch() 方法中。这种情况就是待处理拒绝转移。
ES12 中的新特性
在 ES12 中,新增了一个新的特性来解决待处理拒绝转移的问题。这个特性是 Promise.prototype.finally() 方法。
Promise.prototype.finally() 方法接收一个回调函数作为参数。这个回调函数在 Promise 被 settled(即 fulfilled 或 rejected)后都会执行。它不接收任何参数,也不返回任何值。
以下是一个示例:
Promise.reject(new Error('something went wrong')) .catch(error => { throw new Error('oops!') }) .finally(() => { console.log('finally!') })
在这个示例中,我们在第一个 catch() 方法中抛出了一个错误。然后,Promise.prototype.finally() 方法被调用,并且输出了“finally!”。这个方法不会传递任何错误,所以不会有待处理拒绝转移的问题。
总结
ES12 中的 Promise.prototype.finally() 方法是一个非常有用的特性,它可以帮助我们解决待处理拒绝转移的问题。它是一个非常简单的方法,但是对于处理异步操作时非常有帮助。我们应该在编写异步代码时尽可能地使用它。
示例代码
Promise.reject(new Error('something went wrong')) .catch(error => { throw new Error('oops!') }) .finally(() => { console.log('finally!') })
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65702a4ad2f5e1655d8dd64e