概述
多个组件同时挂载并各自请求同一接口时,应用会发出多个完全相同的请求。请求合并让并发的相同请求共享一个在途 promise,显著减少网络次数,且不改变语义。
关键步骤
- 按方法与 URL 及相关头构造请求键。
- 用映射表保存在途 promise,命中时直接返回它。
- 在 finally 中删除条目,使后续可重新请求。
- 明确它只合并并发请求,不等同于缓存。
验证
- 并发相同请求只触发一次网络调用。
- 多个调用方都拿到同一结果。
- 请求结束后条目被移除。
- 不同用户的请求不会合并。
注意事项
- 合并只对并发请求有效,对顺序重复无效。
- 不能合并方法或请求体不同的非幂等请求。
适用范围
本条目围绕「合并客户端并发请求」给出可复制的步骤、验证方式与常见问题,适合需要按此流程落地的工程团队。执行时请结合自身上下文调整命令与阈值,并在变更前后留存证据,便于后续复核与回滚。
建议在正式环境落地前先在预发或隔离环境演练一遍,把关键观测指标与负责人一并记录,确保出现异常时能快速定位并恢复。
const inflight = new Map();
function get(url) {
const key = `GET ${url}`;
if (!inflight.has(key)) {
inflight.set(key, fetch(url).finally(() => inflight.delete(key)));
}
return inflight.get(key);
}