← 中文资源

简体中文版本

并发去重单飞

对异步函数的并发相同调用去重,只执行一次,所有调用方共享其结果。

阅读英文原文

示例说明

对异步函数的并发相同调用去重,只执行一次,所有调用方共享其结果。本示例属于弹性容错场景,提供可直接复制使用的javascript代码片段,附带边界条件与使用注意事项。

技术要点

  • inFlight Map 缓存进行中的 Promise
  • 相同参数命中返回同一 Promise
  • finally 完成后删除缓存条目

代码解读

上述代码实现了并发去重单飞的核心逻辑。对异步函数的并发相同调用去重,只执行一次,所有调用方共享其结果。代码中包含输入校验、核心算法和结果返回三个部分。关键在于正确处理边界情况,例如空输入、非法参数和并发场景。inFlight Map 缓存进行中的 Promise,相同参数命中返回同一 Promise。这些设计确保代码在生产环境中的健壮性。

使用建议

在实际项目中使用本示例时,建议先理解并发去重单飞的适用场景与限制条件。finally 完成后删除缓存条目。根据具体业务需求调整参数配置,并编写单元测试覆盖正常路径与边界情况。本代码片段可直接集成到现有项目中,或作为参考实现自行扩展。

代码示例

export function singleFlight(fn){const inFlight=new Map();async function d(...a){const key=JSON.stringify(a);if(inFlight.has(key))return inFlight.get(key);const p=fn.apply(this,a).finally(()=>inFlight.delete(key));inFlight.set(key,p);return p;}d.inFlight=inFlight;return d;}