Promise.prototype.finally 是在 ES9 中新增的方法,它可以在 Promise 成功或失败之后做一些操作,无论 Promise 是否被 reject 或 resolve,都会执行 finally 中的代码块。
示例代码
fetch('https://api.example.com/data') .then(response => console.log('success')) .catch(error => console.log('error')) .finally(() => console.log('finally'));
以上代码展示了使用 Promise.prototype.finally 方法,我们在请求结束后,不论成功还是失败,都会执行 finally 方法中的代码块。
理解 finally 方法的意义
有时,在 Promise 链中,我们需要在 Promise 执行完成之后进行一些操作。比如关闭连接,释放资源,清除缓存等。通常,我们会在 then() 和 catch() 方法之后编写相应的代码,但是这种方法存在一个问题,就是无论 Promise 是否成功,我们都必须编写相应的语句。
这时候,Promise.prototype.finally 方法就可以发挥作用,它可以让我们只编写一次关闭连接、释放资源、清除缓存等代码,以确保在 Promise 执行结束时始终都会执行。
promise .then(handleSuccess) .catch(handleError) .finally(handleCleanup)
如上代码所示,无论 Promise 是否被 reject 或 resolve,finally 中的代码块都会始终执行。
finally 方法的语法和用法
Promise.prototype.finally 方法接受一个回调函数,该函数在 Promise 完成时必定会被调用,不管 Promise 的状态如何。finally 方法的语法如下:
promise.finally(onFinally);
在上述代码中,Promise 对象使用 finally 方法添加了一个回调函数 onFinally,不管 Promise 状态如何,都会执行 onFinally 中的逻辑。如果 onFinally 返回的是一个 Promise 那么它会等待这个 Promise 执行结束再继续执行下一步。
finally 的指导意义
- 更好的代码重用性
当我们需要在请求结束后进行一些操作时,比如释放资源或清除缓存,通常情况下我们都需要在 then() 和 catch() 方法之后编写相应的代码。但是这种方法存在一个问题,每次请求都需要编写相同的处理逻辑,代码重复。而使用 finally 方法,则可以让我们避免重复编写相同的代码,提高代码的可读性和可维护性。
- 更好的错误处理
在处理错误时,我们通常会使用 catch 方法捕捉出现的错误,并执行相应的处理逻辑。但是使用 finally 方法,可以让我们统一处理错误,以确保在 Promise 执行结束时,无论成功还是失败,都执行相应的代码逻辑。
- 更强的代码稳定性
使用 finally 方法可以让我们在 Promise 执行结束时,始终至少执行一次相应的代码,以确保资源、缓存等得到正确的释放和清除,提高代码的稳定性和可靠性。
总结
Promise.prototype.finally 方法可以在 Promise 执行结束时做一些操作,无论 Promise 是否被成功或失败都会执行 finally 中的代码块。使用 finally 方法可以提高代码重用性、错误处理能力以及代码稳定性。在使用 Promise 对象时,finally 方法可以用来统一处理结束操作,推荐使用。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/649bd1a048841e9894892fc3