随着前端开发的发展,异步操作越来越常见。Promise 是一种非常常见的异步处理方式。在使用 Promise 的过程中,我们经常会遇到需要在 Promise 完成之后执行一些操作的情形。这时候我们可以使用 Promise 中的 finally() 方法来实现。
finally 方法简介
finally() 方法无论 Promise 是完成态还是拒绝态都会触发,它的执行结果会传递给下一个 Promise。在 finally() 方法内部,我们可以执行一些善后工作,比如清除一些数据,释放资源等等。
用法
finally() 方法的用法非常简单,只需要在 Promise 实例的后面直接调用即可,如下所示:
somePromise() .then(/*这里是成功的回调*/) .catch(/*这里是失败的回调*/) .finally(/*这里是无论成功还是失败都要执行的回调*/)
实例分析
为了更好地理解 finally() 方法,我们可以看看下面这个例子:
-- -------------------- ---- ------- -------- --------- -- - ------ --- ----------------- ------- -- - ------------- -- - --------------------- -- ----- -- - ----------- --------- -- - ---------------- -- ---------- -- - ---------------- -- ----------- -- - ------------------ --
代码中假设有一个异步函数 asyncFunc(),它会在 1 秒钟之后返回一个成功的 Promise,接着我们在 then() 方法中打印出成功的返回值,在 catch() 方法中打印出错误信息,在 finally() 方法中打印出结束的信息。
因为 asyncFunc() 是一个成功的 Promise,所以我们在控制台中会依次看到以下输出:
successful end
值得注意的是,如果我们在 finally() 方法内部返回一个 Promise,那么 finally() 方法就相当于返回了一个新的 Promise,这会导致下面的 then() 方法会等到 finally() 方法内部的 Promise 执行完毕之后才会执行。
应用场景
- 清除 Loading 状态或者一些临时数据
Promise 可以很方便地处理异步请求,而在请求结束之后,我们通常需要清除一些临时数据,比如 Loading 状态、临时存放的数据等等。这时候就可以使用 finally() 方法来实现。
-- -------------------- ---- ------- -------- ------- -- - ---------------- ------ ----------------------------------------- --------- -- - ----------------- -- ---------- -- - ------------------ -- ----------- -- - ----------------- --------------- -- -
- 清除定时器和释放资源
在一些需要使用定时器的场景下,我们需要在结束时清除定时器和释放资源。
-- -------------------- ---- ------- -------- -------------- -- - --- - - - --- ----- - -------------- -- - --- -- -- - --- - -------------------- -------------- - ---- - -- -- ---- --------- - -- - -------- ------------ -- - -- -- ---- ----- ---- - ---------------- ----------- -- - --------------- --
总结
Promise 中的 finally() 方法是一个很有用的函数,它可以在任何情况下都被执行。对于一些资源释放等善后操作,都可以在这里完成。了解 finally() 的用法可以提高我们的代码质量,在开发中遇到类似的需求时可以有针对性地解决问题。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/645b2eee968c7c53b0d8a888