← 中文资源

简体中文版本

合并客户端并发请求

让同一资源的调用方共享同一个在途 promise,使一次突发重复请求只发出一次网络调用。

阅读英文原文

概述

多个组件同时挂载并各自请求同一接口时,应用会发出多个完全相同的请求。请求合并让并发的相同请求共享一个在途 promise,显著减少网络次数,且不改变语义。

关键步骤

  1. 按方法与 URL 及相关头构造请求键。
  2. 用映射表保存在途 promise,命中时直接返回它。
  3. 在 finally 中删除条目,使后续可重新请求。
  4. 明确它只合并并发请求,不等同于缓存。

验证

  • 并发相同请求只触发一次网络调用。
  • 多个调用方都拿到同一结果。
  • 请求结束后条目被移除。
  • 不同用户的请求不会合并。

注意事项

  • 合并只对并发请求有效,对顺序重复无效。
  • 不能合并方法或请求体不同的非幂等请求。

适用范围

本条目围绕「合并客户端并发请求」给出可复制的步骤、验证方式与常见问题,适合需要按此流程落地的工程团队。执行时请结合自身上下文调整命令与阈值,并在变更前后留存证据,便于后续复核与回滚。

建议在正式环境落地前先在预发或隔离环境演练一遍,把关键观测指标与负责人一并记录,确保出现异常时能快速定位并恢复。

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);
}