理解返回结果的结构
- 当使用
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); }); } }); }); - 在这个例子中,对于成功的结果,先进行数据整合,然后发送新的请求;对于失败的结果,先记录错误日志,然后尝试重新执行相关操作,并在重新执行成功后打印结果。