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

如何用Promises避免并行重复API调用?

解决方案:缓存Promise避免重复API调用

核心思路是缓存正在进行的Promise实例,而不是仅缓存最终的响应结果。这样同一参数的并行请求会共享同一个Promise,等待其完成后获取结果,彻底避免重复发起API调用。

简洁优化版代码

const _cache = new Map();

function callAPI(param) {
    // 检查是否已有缓存(pending Promise 或已完成的结果)
    if (_cache.has(param)) {
        return _cache.get(param);
    }

    // 发起新请求并创建Promise
    const requestPromise = fetch(API_URL, { param })
        .then(response => {
            // 处理响应为业务需要的res(示例:解析JSON并处理)
            return response.json().then(rawData => {
                // 这里替换成你的实际响应处理逻辑
                const res = rawData;
                if (!res) throw new Error('无效的API响应');
                
                // 替换缓存为已resolved的Promise,后续请求直接拿结果
                _cache.set(param, Promise.resolve(res));
                return res;
            });
        })
        .catch(error => {
            // 请求失败时移除缓存,允许后续重新发起请求
            _cache.delete(param);
            throw error; // 传递错误给调用方
        });

    // 将pending的Promise存入缓存
    _cache.set(param, requestPromise);
    return requestPromise;
}

关键逻辑说明

  • 缓存复用机制:用Map存储两种状态的内容:正在等待的pending Promise、已完成的成功结果(包装为resolved Promise)
  • 并行请求共享:同一参数的第二个请求发起时,直接返回缓存中已存在的pending Promise,无需重复调用API
  • 成功缓存固化:请求成功后,将缓存中的pending Promise替换为已resolved的结果Promise,后续请求直接获取最终数据
  • 失败缓存清理:请求失败时删除对应缓存,避免后续请求一直拿到失败的Promise,允许重新发起请求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 13:34:50