在前端开发中,经常需要进行多个异步请求的并行调用,并且需要在所有请求完成后执行某些操作。在早期的javascript中,我们可能需要手动去实现Promise.all()方法来处理这样的问题。但是在ES11中,新增了Promise.allSettled()方法来更好地优化异步请求的处理。下面,我们将详细了解Promise.allSettled()的使用及优化方法。
Promise.allSettled() 的详细介绍
Promise.allSettled() 方法接收一个可迭代对象,通常是一个Promise数组,返回一个新的Promise,这个Promise将在所有的Promise都完成后被解析。
Promise.allSettled() 方法的生成器返回的Promise在所有的Promise都完成时被解决,不考虑它们是否完成或者被拒绝。它返回解析结果,即便是被拒绝。
例如,以下的Promise.allSettled() 将会返回一个数组,数组中的每一项都是一个对象,对象的状态代表了相应Promise的状态。
Promise.allSettled([ Promise.resolve('A'), Promise.reject('B'), Promise.resolve('C') ]).then(results => { console.log(results); }); // Output: [{status: 'fulfilled', value: 'A'}, {status: 'rejected', reason: 'B'}, {status: 'fulfilled', value: 'C'}]
上述例子中,Promise.reject() 被拒绝的Promise,Promise.resolve() 被解决的Promise。 Promise.allSettled() 的返回结果是一个对象数组,其中每一个对象都包含两个属性:状态值(status)和状态结果(value 或 reason)。
Promise.allSettled() 的优势
Promise.allSettled() 方法相较于早期的Promise.all() 方法的优势在于,即使 Promise.allSettled() 中的 Promise 不全都得以解决,该方法也会把所有 Promise 都“完成”后的结果一并返回。这使得我们可以很方便地处理 Promise 拒绝的情况,而非全部考虑 Promise 的解决。
Promise.allSettled() 的用法
在处理多个异步请求时,我们通常会使用Promise.all()方法。例如,如果我们需要在一个页面上显示多个资源,每个资源都是异步加载的,代码可能如下所示:
-- -------------------- ---- ------- ----- --------- - --- -- - ------ --- ----------------- ------- -- - ----- --- - --- -------- ------- - ---- ---------- - -- -- ------------- ----------- - ------- -- -- ------------- ------------------------------------------------ ------------------------------------------------ ------------------------------------------------ -------------- -- - -------------------- -- - --------------------------------- --- -------------- -- - --------------------- ---
如果其中一个 Promise 被拒绝,Promise.all()将会直接拒绝,导致所有 Promise 都会被丢弃。 实际上,我们只想拒绝 Promise 中被拒绝的 Promise。
在这种情况下,我们可以使用 Promise.allSettled() 方法来处理 Promise 。代码如下所示:
-- -------------------- ---- ------- -------------------- ------------------------------------------------ ------------------------------------------------ ------------------------------------------------ --------------- -- - ---------------------- -- - -- -------------- --- ------------ - ---------------------------------------- - ---- - ----------------------------- - --- ---
总结
在ES11中,新增的Promise.allSettled()方法可以更好地优化多个异步请求的处理。与Promise.all() 不同的是,无论 Promise 是否被拒绝,该方法都将所有的 Promise 的状态一并返回,这使得我们可以很方便地处理 Promise 的拒绝情况。
在实际的开发中,我们需要根据不同的情况来灵活使用Promise.all() 或是 Promise.allSettled() 方法,以达到最优的异步请求处理效果。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65029a9695b1f8cacdfd9484