ES9 中新增的 Promise.prototype.finally() 方法解决 Promise 异常捕获问题
在前端开发中,Promise 已经成为了异步编程的不二选择。而在 ES9 中,引入了 Promise.prototype.finally() 方法,它能够为 Promise 对象添加一个状态不管怎样都会执行的回调函数,解决了 Promise 异常捕获问题。
Promise.prototype.finally() 是一个实例方法,它不接受任何参数,并且返回一个新的 Promise 对象。当 Promise 状态变成 fulfilled 或 rejected 时,它都会执行。Promise.prototype.finally() 方法返回的 Promise 对象将会是前一个 Promise 对象的状态和值,如果在调用 Promise.prototype.finally() 时出现异常,那么返回的 Promise 对象会将该异常传递给下一个 Promise。
接下来看一个示例,首先我们需要编写一个 Promise:
-- -------------------- ---- ------- -------- ---------------- - ------ --- ----------------- ------- -- - -- ---- - -- - ------------- - ---- - ---------- ---------- ------ ----- - --- -
我们可以将其使用 then 方法以及 catch 方法进行调用:
PromiseTest(-1) .then(data => console.log('resolve: ', data)) .catch(error => console.log('reject: ', error.message));
这会输出 reject: num 必须大于等于 0
,这符合我们的预期。
如果我们需要在 Promise 的结束状态(无论是 resolve 还是 reject)之后执行某些逻辑,可以使用 finally 方法:
PromiseTest(-1) .then(data => console.log('resolve: ', data)) .catch(error => console.log('reject: ', error.message)) .finally(() => console.log('finally'));
这会输出 reject: num 必须大于等于 0
和 finally
,说明 finally 方法确实在 Promise 状态改变之后被执行了。
在实际开发中,finally 方法能够解决一些异常情况下的资源回收问题。比如我们需要在某些 HTTP 请求完成之后关闭 loading 状态,无论请求成功或失败:
showLoading(); axios.get('https://example.com') .then(response => console.log('数据获取成功')) .catch(error => console.log('数据获取失败')) .finally(() => hideLoading());
在这个例子中,无论请求成功或失败,finally 方法中的 hideLoading 函数都能够被执行到,用来关闭加载状态。
总结来说,Promise.prototype.finally() 方法能够在 Promise 状态变化之后无论成功或失败,都能够执行一些逻辑,解决了一些异常情况下的资源回收问题。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64677b4a968c7c53b07dd158