在前端开发中,我们经常需要处理异步操作,例如加载数据、发送网络请求等等。ES6 引入了 Promise,可以更优雅地处理异步操作,而 ES9 则新增了一些新的 Promise 方法,可以更好地解决异步操作时的并发问题。
Promise.allSettled
在实际开发中,我们可能需要同时发起多个异步请求,然后在所有请求完成后处理数据。这时候可以使用 Promise.all
方法来等待所有请求完成,例如:
Promise.all([ fetch('/api/data1'), fetch('/api/data2') ]).then(([res1, res2]) => { // 处理返回的数据 });
但是这种方式有一个缺点:如果其中某个请求失败了,整个 Promise.all
的状态就会变为 rejected,并且后面的操作将无法进行。为了避免这种情况,ES9 引入了 Promise.allSettled
方法。
使用 Promise.allSettled
方法可以等待所有请求完成,而不管它们的状态是 fulfilled 还是 rejected。例如:
-- -------------------- ---- ------- -------------------- -------------------- ------------------- -------------- -- - ----------------- ------- ------ ------ -- -- - -- ------- --- ------------ - -- ------- ----- - ---- - -- ------- ------ - --- ---
Promise.any
Promise.any
方法是 ES9 新增的另一个 Promise 方法,用于解决多个异步请求时,只要其中一个请求成功即可立刻返回的场景。
例如,在一个搜索页面中,我们可能需要同时搜索多个不同的数据源,并且只要有一个数据源返回了结果,就可以显示在页面上。这时候可以使用 Promise.any
方法来等待所有请求完成,然后返回第一个成功的请求结果。例如:
-- -------------------- ---- ------- -------- ------------- - ----- ------------- - ----------------------------- ----- ------------- - ----------------------------- ----- ------------- - ----------------------------- ------ --------------------------- -------------- ---------------- - ---------------------------------- -- - -- ------ -------- ---
Promise.prototype.finally
Promise.prototype.finally
方法是 ES9 新增的另一个 Promise 方法,用于设置无论 Promise 是否被 rejected 或者 fulfilled,都必须执行的回调函数。
例如,在一个请求发出和请求响应之间,我们可能需要显示一个等待动画,确保用户知道请求正在进行中。这时候就可以使用 Promise.prototype.finally 来关闭等待动画,例如:
-- -------------------- ---- ------- ------------------- ----------- -- - -- ------ -- -------------- -- - -- ------- -------- -- ------------ -- - -- --------- ----- ---
结论
ES9 引入的这些新的 Promise 方法,可以更好地解决异步操作时的并发问题,让我们写出更优雅、更健壮的代码。在日常开发中,应该尽可能地使用这些新的方法,提高代码的可读性和可维护性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/674b14cd0b2e50ef9953f421