Promise 是 JavaScript 中重要的异步编程工具之一,它提供了改善回调地狱的解决方案。ES8 中增加了 Promise.finally() 方法,使得 Promise 更加完善和灵活。本文将详细介绍 Promise.finally() 方法的使用指南。
Promise.finally() 的用途
Promise.finally() 方法的作用是注册一个回调函数,该函数在 Promise 执行完毕后无论其是否成功都会被执行。该函数接受一个没有参数的函数作为参数,并且该函数将会返回一个新的 Promise 对象。这个新的 Promise 对象的状态和值与原来的 Promise 对象的状态和值都是相同的。
Promise.finally() 方法的用途在于无论 Promise 执行状态如何,都需要执行一些代码,例如关闭网络连接,释放资源等等。在这些场景下,我们可以使用 Promise.finally() 来实现代码的复用和清理。
使用 Promise.finally() 的基本用法
下面是一个使用 Promise.finally() 的基本代码示例:
// javascriptcn.com code example let p = new Promise((resolve, reject) => { // do something here }); p.then(result => { // do something with the result }).catch(err => { // handle the error here }).finally(() => { // clean up the resources here });
在上述代码中,我们在 Promise 对象中使用了三个方法: then(), catch(), finally() 。然而,finally() 方法并不是必须的。可以根据具体需求选择使用。
Promise.finally() 的注意点
在使用 Promise.finally() 时需要注意以下几点:
finally() 方法不会接收任何参数。
无论 Promise 对象成功或失败,finally 都会被执行。
finally() 方法返回一个新的 Promise 对象。如果在 finally() 中抛出异常,这个新的 Promise 对象将会以错误的形式被 rejected 。
使用 Promise.finally() 的通俗示例
下面是一个更加具体的示例,假设我们要读取一个文件的内容:
// javascriptcn.com code example const fs = require('fs'); const readFile = function (fileName) { return new Promise(function (resolve, reject) { fs.readFile(fileName, function (error, data) { if (error) return reject(error); resolve(data); }); }); } readFile('/path/to/file').then(function (data) { console.log(data.toString()); }).catch(function (err) { console.error(err); }).finally(function () { console.log('Cleaning up resources'); });
在上述代码中,我们使用一个可以读取文件内容的 Promise 对象 readFile() 。其中,我们使用了 then(), catch(), finally() 方法,假设 Promise 执行成功,则使用 then() 方法将 Promise 的结果转化为字符串并输出;如果 Promise 执行失败,则使用 catch() 方法处理错误。最后,使用 finally() 方法清理资源。
使用 Promise.finally() 处理多个 Promise 对象
在某些场景下,我们需要处理多个 Promise 对象,并在所有 Promise 对象执行完毕后清理资源。在这种情况下,可以使用 Promise.all() 方法以及 Promise.finally() 方法来实现。下面是一个示例代码:
// javascriptcn.com code example const p1 = Promise.resolve(1); const p2 = Promise.resolve(2); const p3 = Promise.reject(new Error('Something went wrong')); Promise.all([p1, p2, p3]).then(values => { console.log(values); }).catch(error => { console.error(error); }).finally(() => { console.log('Cleaning up resources'); });
在上述代码中,我们使用了三个 Promise 对象 p1, p2, p3 , 其中 p3 是一个 rejected 的 Promise 对象。使用 Promise.all() 方法并传入 Promise 对象数组,Promise.all() 方法返回一个 Promise 对象。使用 then() 方法处理 Promise 执行结果,使用 catch() 方法处理 Promise 执行失败的情况,使用 finally() 方法清理资源。
结论
在 ES8 中,我们有了 Promise.finally() 方法,可以在 Promise 执行完毕后进行清理、释放资源等等。本文详细介绍了 Promise.finally() 方法的使用指南,包括基本用法和使用注意点以及通俗易懂的示例代码。同时,我们也介绍了如何使用 Promise.finally() 处理多个 Promise 对象的情况。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67378556317fbffedf0ad43c