You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中如何检测进行中的API请求并复用同ID请求的返回结果

Node.js 同商品ID并发请求合并实现方案

你需要在原有缓存逻辑的基础上,新增对进行中请求的复用能力,核心思路是将未完成的请求Promise直接存入缓存,相同ID的后续请求直接复用该Promise,等请求返回后所有等待的请求会同时拿到相同结果。
修正后的完整代码如下:

let cache = new Map();

const getCost = async (itemId) => {
  // 缓存命中:直接返回已缓存的价格,或者进行中的请求Promise
  if (cache.has(itemId)) {
    return cache.get(itemId);
  }

  // 发起外部请求,同时将Promise存入缓存,供后续同ID请求复用
  const pricePromise = getExternalCost(itemId)
    .then(price => {
      // 可选:如果需要设置缓存有效期,可在此处添加定时器到期删除对应key
      // setTimeout(() => cache.delete(itemId), 10 * 60 * 1000); // 示例:缓存10分钟
      return price;
    })
    .catch(err => {
      // 请求失败时删除缓存key,避免后续请求一直拿到失败结果
      cache.delete(itemId);
      throw err;
    });

  cache.set(itemId, pricePromise);
  return pricePromise;
}

逻辑说明

  • 首次调用getCost('123')时缓存为空,会将请求Promise存入缓存后返回
  • 相同ID的第二个请求进来时,直接返回缓存中已存在的Promise,不会重复发起外部请求
  • 外部接口返回结果后,两个请求会同时拿到响应值,完全匹配你给出的时序要求
  • 修正了原有代码的笔误:原代码末尾return cost变量名错误,已统一为price变量
  • 可选添加缓存有效期逻辑,满足价格定期更新的业务需求

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 23:24:06