随着 JavaScript 的发展,Promise 已经成为了处理异步操作的标准方式。但是处理异常一直是 Promise 处理中的难点之一。在 ES8 中,引入了 Promise.prototype.finally() 方法,为处理 Promise 中的异常提供了更好的方式。
Promise.prototype.finally() 方法的作用
在 Promise 中,无论 Promise 执行成功还是失败,都会返回一个新的 Promise 对象。但是,如果我们只想在 Promise 执行结束后执行一段代码,无论 Promise 的执行结果如何,到现在为止我们只能使用 .then() 方法。然而,.then() 方法只能捕获 Promise 执行成功的情况,如果 Promise 执行失败,.then() 方法将不会执行。为了解决这个问题,Promise.prototype.finally() 方法被引入了。
Promise.prototype.finally() 方法将会在 Promise 执行结束后,不论结果是成功还是失败,都会执行一次回调函数。它接收一个函数作为参数,在 Promise 结束后被调用。该方法返回一个新的 Promise 对象,并可传递原 Promise 对象的结果或错误。
使用 Promise.prototype.finally() 方法来正确处理异常
在使用 Promise.prototype.finally() 方法来正确处理异常时,通常的做法是在 .catch() 方法后面调用。因为 .catch() 方法是检测并处理 Promise 执行失败时的异常,使用 .finally() 方法来处理异常会使得异常被正确处理并且可以避免一些潜在的问题。
以下是一个使用 Promise.prototype.finally() 方法来正确处理异常的示例:
-- -------------------- ---- ------- -------- ----------- - ------ --- ----------------- ------- -- - ------------- -- - ----- ------------ - -------------- -- ------------- - ---- - ------------- ------- ---------------- - ---- - -------------- -- ----- -------- - -- ------ --- - ----------- ----------- -- - ----------------- -- ------------ -- - ------------------- -- ----------- -- - ----------------- -------- ------------- ---
这个示例中,我们定义了一个 fetchData() 函数,用于异步获取数据。在 fetchData() 函数中,我们通过生成一个随机数来模拟两种不同的情况:有时候我们会成功获取数据,有时候我们会获取失败。
在 .then() 方法中,我们打印出了成功获取数据的信息。在 .catch() 方法中,我们打印出了获取数据失败时的异常。在 .finally() 方法中,我们打印出了无论 Promise 的执行结果如何,数据获取都已完成的信息。
注意事项
在使用 Promise.prototype.finally() 方法时,我们需要注意一些事项:
.finally() 方法的回调函数不会接收参数。
.finally() 方法返回一个新的 Promise 对象,因此我们可以在 .finally() 方法后面继续链式调用其他的方法,但是需要注意返回的是新的 Promise。
这个方法在不少情况下都是不必要的并且过于复杂,因此先尝试使用 .then() 或者 .catch() 方法去处理异步操作异常。
结论
在本文中,我们了解了 ES8 中新引入的 Promise.prototype.finally() 方法,学习了该方法的作用和使用方式,以及该方法使用时需要注意的问题。了解了如何使用 Promise.prototype.finally() 方法能够帮助我们更好地在开发中捕获和处理异常,并在代码中提供更好的可读性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/670396c0d91dce0dc84bba22