在日常的前端开发中,我们常常使用 Promise 来处理异步操作。Promise 最重要的优点是可以避免回调地狱,因为 Promise 可以链式调用,使代码更加清晰易懂。然而,Promise 链的一些操作之间会存在重复的代码,比如无论成功还是失败都需要执行某些操作。为此,ES8 中新增的 Promise.prototype.finally() 方法可以帮我们很好地解决这个问题。
Promise.prototype.finally() 方法是什么?
Promise.prototype.finally() 方法返回一个 Promise,在 Promise 结束时,无论结果是 fulfilled 还是 rejected,都会执行指定的回调函数。这可以避免在 then() 和 catch() 中重复地编写同样的代码。
Promise.prototype.finally() 方法的使用例子
比如我们需要向后端提交表单数据,向后端存储数据的过程可能会出现网络或者服务端异常。一般的做法是使用 then() 和 catch() 方法,分别处理成功和失败的情况。 如下所示:
submitForm(data).then(response => { console.log('数据提交成功', response) showSuccessMessage() }).catch(error => { console.log('数据提交失败', error) showErrorMessage() })
在上面的例子中,我们需要在成功和失败的代码块中分别调用 showSuccessMessage() 和 showErrorMessage() 方法。为了提高代码复用,我们可以使用 finally() 方法,如下所示:
submitForm(data).then(response => { console.log('数据提交成功', response) }).catch(error => { console.log('数据提交失败', error) }).finally(() => { showNotification() })
在这个例子中,我们只需要将 showNotification() 方法放在 finally() 方法中,就可以避免重复编写同样的代码了。如果无论成功还是失败都需要执行某些代码,就可以使用 finally() 方法。
注意事项
需要注意的是,finally() 方法返回的仍然是一个 Promise 对象,因此在 finally() 方法中抛出异常或者返回新的 Promise 对象,都会影响后续的逻辑。因此在使用 finally() 方法时一定要慎重考虑,确保代码的正确性和可读性。
总结
使用 ES8 中的 Promise.prototype.finally() 方法,可以有效地避免在 Promise 链中重复编写同样的代码,提高代码复用性和可读性。在使用该方法时,需要注意返回的依然是 Promise 对象,因此需要慎重考虑,确保代码的正确性和可读性。
参考资料
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/652f39a47d4982a6eb04c797