ES9 的新特性:Promise.prototype.finally() 和 Promise.allSettled()
在前端开发中,异步任务是必不可少的一部分。在处理异步代码时,我们常常需要解决两个问题:如何处理错误,以及如何控制多个异步任务的并行执行。ES9 的新特性 Promise.prototype.finally() 和 Promise.allSettled(),为我们提供了更好的解决方案。
Promise.prototype.finally()
在 Promise 的实例中,无论 Promise 状态如何(fulfilled、rejected 或 pending),我们都可以通过 Promise.prototype.then() 处理其返回值或错误。但是,无论 Promise 状态如何,我们都需要执行一些清理操作(如关闭文件、数据库连接等),这时 Promise.prototype.finally() 就可以派上用场了。
Promise.prototype.finally() 接收一个回调函数作为参数,该函数在 Promise 状态为 fulfilled 或 rejected 时都会被执行。也就是说,当 Promise 对象执行完毕后,无论成功还是失败,都会执行该函数。它的使用方法如下:
------- ------------ -- - -- -- ------- ----- -- ------------ -- - -- -- ------- ----- -- ----------- -- - -- - ------- ---------- ---
例如,我们可以在使用 fetch 获取数据后,无论成功还是失败都关闭加载中的遮罩层:
---------- -------------- -- -- ---- --- ------------ -- -- ---- --- ----------- -- - ------------------ ---
Promise.allSettled()
Promise.all() 是一种常用的并行执行多个异步任务的方法。当我们需要一次性获取多个数据时,我们可以使用 Promise.all() 并行发起多个请求。它的使用方法如下:
---------------------- --------- ---------- ------------- -- - -- ---- ------- -------- -- ------------ -- - -- ---- ------- ------------- ---
但是,Promise.all() 存在一个问题:当其中任何一个异步任务执行失败时,所有异步任务均会中断,Promise.all() 会立即触发失败状态,导致无法获取成功的异步任务结果。
Promise.allSettled() 则没有这种问题,它接收一个 Promise 数组作为参数,每个 Promise 都将在数组中按顺序处理。所有 Promise 都完成后,返回的结果将以数组形式返回,每个数组元素都是一个对象,对象包含 Promise 的状态(fulfilled 或 rejected)和结果(如果是 fulfilled)。它的使用方法如下:
----------------------------- --------- ---------- ------------- -- - ---------------------- -- - -- -------------- --- ------------ - -- -- ------- -------- - ---- - -- -- ------- ------- - --- ---
例如,我们可以并行获取多个文件的元数据(文件名、大小、创建日期等),并将结果显示在页面上:
----- -------- - - ----------------------- ----------------------- ---------------------- -- ---------------------------- ------------- -- - ------------------------ ------ -- - -- -------------- --- ------------ - -- ---- ------- -------- ----- -------- - ------------- ------------------------ ------- - ---- - -- ---- ------- ------- ----- ----- - -------------- --------------------- -- ----- -------- --- ---- --------- ----------- - --- ---
总结
Promise.prototype.finally() 和 Promise.allSettled() 是 ES9 新增的两个 Promise 方法,分别解决了异步代码中的错误处理和多个异步任务并行问题。它们的使用不仅可以提高代码质量,还可以提高开发效率,因此我们在实际开发中也应该善加应用。
参考链接:
来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/6519500595b1f8cacd17e038