Promise 是 JavaScript 中处理异步操作的现代工具。使用 Promise 可以避免回调地狱,将异步操作的结果作为参数传递给其它函数,并链式调用多个异步操作。Promise 中的 finally 方法可以在 Promise 完成后无论是成功还是失败都会执行,但是如果在 finally 中抛出了异常,它会在 Promise 完成后继续抛出并在 catch 中捕获。本文将介绍如何在 Promise 中处理 finally 抛出的错误。
Promise 介绍
Promise 是 JavaScript 一种处理异步操作的现代机制。在 Promise 中,异步操作的结果可以作为 Promise 对象的状态,在 Promise 对象状态变为 resolved(已解决)或者 rejected(已拒绝)时会执行后续的操作。其中,resolved 表示异步操作已经成功完成,rejected 表示异步操作出现了错误或者失败了。
在 Promise 中,可以使用 then 方法来处理 resolved 状态的结果,catch 方法来处理 rejected 状态的结果。Promise 还有一些其它方法,例如 finally 方法,它将在 Promise 完成以后无论成功或者失败都会执行。
finally 方法介绍
finally 方法是 Promise 原型上的一个方法。它接受一个函数作为参数,在 Promise 完成时无论成功还是失败都会执行该函数。finally 方法的返回值为一个新的 Promise 对象,并且该对象的状态和原来的 Promise 对象状态保持一致。
promise.finally(() => { console.log('Promise completed.') });
finally 方法的异常处理
在 finally 方法中抛出异常会导致异常继续传递到下一个 catch 方法中。如果 catch 中已经处理了异常,finally 中抛出的异常会被忽略。但是如果 catch 未处理异常,抛出异常的代码会在 catch 中捕获。
在以下示例中,finally 中抛出的异常会在 catch 中捕获:
-- -------------------- ---- ------- -------------------------- -------- -- - -------------------- ------------ -- ------------ -- - -------------------- ----------- ------- -- ----------- -- - ----- --- -------------- --------- -- ------------ -- - ------------------ -------- ------- ---
在这个例子中,Promise 会被 resolve,然后执行 then 方法中的代码,接着会执行 finally 中的代码,finally 中抛出异常会被 catch 中的代码捕获,输出结果为:
Promise resolved. Catch Error: Error: Finally Error.
在 finally 中正确的处理异常
正常情况下,在 finally 中的代码不应该抛出异常。但是有时候在 finally 中确实需要写异常处理代码。为了避免上面例子中的问题,可以在 finally 中捕获异常,并返回一个 resolved 的 Promise 对象,这样 finally 中的异常就会被忽略。
-- -------------------- ---- ------- -------------------------- -------- -- - -------------------- ------------ -- ------------ -- - -------------------- ----------- ------- -- ----------- -- - --- - ----- --- -------------- --------- - ----- ------- - -------------------- -------- ------- - ------ ------------------ -- ------------ -- - ------------------ -------- ------- ---
在这个例子中,finally 中抛出异常会被 try-catch 块捕获,并输出 Finally Error,然后返回一个 resolved 的 Promise 对象,finally 中的异常不会传递到 catch 方法中。
结论
在 Promise 中使用 finally 方法是一个很好的习惯,但是它可能会抛出异常并导致程序的错误。为了避免这种情况,我们可以在 finally 中捕获异常并返回一个 resolved 的 Promise 对象。这样保证了 finally 中的代码会被执行,同时不会导致无法预测的错误。
在编写 Promise 代码时,尽量使用 finally 方法,同时正确处理异常,这样可以提高程序的健壮性和可维护性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6708b113d91dce0dc873a8b5