使用 promise.allsettled 结合 map 或 set 可以实现异步操作的并行合并与去重。核心做法是:将待执行的异步任务按唯一标识(如 id)分组,对每个唯一标识只发起一次请求,利用 promise.allsettled 等待所有请求完成,最后根据状态收集结果并返回。

如何基于 ID 对 Promise 进行去重
通过检查缓存 Map 中是否已存在对应 ID 的 Promise 实例来实现去重。如果存在,直接复用该 Promise;如果不存在,则创建新 Promise 并存入 Map,确保同一时刻同一 ID 只有一个异步操作在运行。

const cache = new Map();
function fetchWithDedup(id, fetchFn) {
if (cache.has(id)) {
return cache.get(id);
}
const promise = fetchFn(id).finally(() => {
// 可选:根据需求决定是否清理缓存
// cache.delete(id);
});
cache.set(id, promise);
return promise;
}
如何处理混合成功与失败的异步结果
使用 Promise.allSettled 可以并行执行多个可能失败的异步操作,并统一处理成功和失败的状态。它不会因某个 Promise 拒绝而立即中断,而是等待所有操作结束,返回一个包含每个操作状态的对象数组。

async function mergeResults(promises) {
const results = await Promise.allSettled(promises);
return results.map(r => ({
status: r.status,
value: r.status === 'fulfilled' ? r.value : null,
reason: r.status === 'rejected' ? r.reason : null
}));
}
当输入中存在重复 ID 时程序的具体行为
当输入数组中包含重复的 ID 时,程序会识别这些重复项,并为每个唯一的 ID 仅创建一个异步任务。这意味着即使输入中有多个相同的 ID,底层的网络请求或计算逻辑也只会被触发一次,从而节省资源并保证数据一致性。最终返回的结果列表长度等于唯一 ID 的数量,而不是原始输入的长度。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











