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
相关产品推荐
相关产品推荐

