理解返回结果的结构
- 当使用
Promise.allSettled()
时,它返回一个Promise,这个Promise被解决(resolved)后会返回一个数组。数组中的每个元素是一个对象,这个对象有两个属性:status
和value
或reason
。 status
属性的值为"fulfilled"
或者"rejected"
,用于表示对应的Promise是成功还是失败。当status
为"fulfilled"
时,对象有value
属性,其值为对应的Promise成功返回的值;当status
为"rejected"
时,对象有reason
属性,其值为对应的Promise被拒绝的原因。
- 当使用
遍历结果数组进行处理
- 可以使用
forEach
或for...of
循环来遍历Promise.allSettled()
返回的结果数组,根据每个元素的status
属性来分别处理成功和失败的情况。 - 示例代码如下:
Promise.allSettled([promise1, promise2, promise3]) .then((results) => { results.forEach((result) => { if (result.status === "fulfilled") { console.log(`成功:${ result.value}`); } else { console.log(`失败:${ result.reason}`); } }); });
- 在这个例子中,对于每个
result
对象,如果status
是"fulfilled"
,就打印成功的值;如果是"rejected"
,就打印失败的原因。
- 可以使用
提取成功或失败的结果
- 提取成功结果:
- 可以使用
filter
方法来提取所有成功的结果。例如:Promise.allSettled([promise1, promise2, promise3]) .then((results) => { const fulfilledResults = results.filter((result) => result.status === "fulfilled"); console.log(fulfilledResults.map((result) => result.value)); });
- 这里先使用
filter
筛选出status
为"fulfilled"
的结果,然后使用map
提取出这些成功结果的value
属性,最后打印出来。
- 可以使用
- 提取失败结果:
- 类似地,提取失败结果可以这样做:
Promise.allSettled([promise1, promise2, promise3]) .then((results) => { const rejectedResults = results.filter((result) => result.status === "rejected"); console.log(rejectedResults.map((result) => result.reason)); });
- 先筛选出
status
为"rejected"
的结果,再提取出它们的reason
属性并打印。
- 类似地,提取失败结果可以这样做:
- 提取成功结果:
基于不同状态进行复杂操作
- 根据业务需求,可以在成功或失败的处理分支中进行更复杂的操作。例如,在成功分支中对数据进行整合或进一步的异步请求,在失败分支中记录错误日志或者尝试重新执行相关操作。
- 示例代码如下:
Promise.allSettled([promise1, promise2, promise3]) .then((results) => { results.forEach((result) => { if (result.status === "fulfilled") { // 假设result.value是一个包含数据的对象,进行数据整合 const integratedData = integrateData(result.value); // 发送新的异步请求,使用整合后的数据 sendNewRequest(integratedData); } else { // 记录错误日志 logError(result.reason); // 尝试重新执行相关操作(如果合适的话) const newPromise = retryOperation(result.reason); newPromise.then((newResult) => { console.log("重新执行后的结果:", newResult); }); } }); });
- 在这个例子中,对于成功的结果,先进行数据整合,然后发送新的请求;对于失败的结果,先记录错误日志,然后尝试重新执行相关操作,并在重新执行成功后打印结果。