使用 ES12 中的 Promise.allSettled 方法替代 Promise.all
Promise.all 是一个非常常用的方法,它接收一个数组作为参数,数组中的每一项为一个 Promise 实例,当这些实例全部变成 resolved 状态时,Promise.all 返回一个新的 Promise 实例,该实例的状态变成 resolved 状态,并将所有 Promise 实例的结果放入到一个数组中返回。如果数组中的任意一项变成了 rejected 状态,Promise.all 就会停止运行,并返回一个新的 Promise 实例,该实例的状态变成 rejected 状态。
这样的行为在某些情况下是不理想的。比如,如果我们正在进行一个数据请求,而请求中有一个或几个数据返回失败,我们还是希望获得所有请求的数据,不管是否成功。这个时候,Promise.all 就无法满足我们的要求。
幸运的是,ES12 中添加了一个新的 Promise.allSettled 方法,该方法与 Promise.all 的行为类似,但是它会等待所有 Promise 实例都变成 settled 状态,也就是不管它们的状态是 resolved 还是 rejected,都会等到它们完成后才会返回。同时,它返回的结果也更加详细,不仅包含 resolved 状态下的结果,还包含 rejected 状态下的原因。
下面我们来看看它的使用方法:
-- -------------------- ---- ------- ----- -------- - - ---------------------------- --------------------------- ------------------------- -------- -- --------------------- ------------ -- -------------------- ------------ -- -------------------- ---------------------------- ------------- -- ----------------------
在这个例子中,我们有一个包含三个 Promise 实例的数组,其中一个是 resolved 状态,一个是 rejected 状态,另一个是 resolved 状态。在使用 Promise.all 方法时,由于其中一个 Promise 实例是 rejected 状态,它会直接返回一个错误。而在使用 Promise.allSettled 方法时,它会等待所有 Promise 实例都完成,并且返回所有 Promise 实例的结果,包括 rejected 状态的原因:
Promise.all 返回:rejected Promise.allSettled 返回:[ { status: 'fulfilled', value: 'resolved' }, { status: 'rejected', reason: 'rejected' }, { status: 'fulfilled', value: 'resolved again' }, ]
可以看到,Promise.allSettled 方法返回的是一个包含对象的数组,每个对象都有 status 属性和对应的值。如果 Promise 实例的状态是 resolved,值会被放在 value 属性中,状态是 rejected,原因会被放在 reason 属性中。这样详细的返回结果对于调试和排除错误非常有用。
总结
ES12 中的 Promise.allSettled 方法是一个非常有用的工具,可以用于并行的获取多个 Promise 的结果。它能够返回包含每个 Promise 实例的详细信息的数组,不管 Promise 实例的状态是什么。这个方法可以很好地处理一些 Promise.all 无法完成的任务。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/648fc83b48841e9894df0359