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

JavaScript异步函数中Google表格数据复用问题咨询

解决重复请求Google表格数据及异步数据复用问题

核心解决思路

  • 缓存数据,避免重复请求:只发起一次Google表格数据请求,后续所有操作都复用缓存的结果
  • 利用Promise处理异步:通过缓存请求的Promise对象,确保需要使用数据时,数据已经加载完成

具体实现代码及步骤

1. 添加全局缓存变量

先声明一个全局变量,用来缓存数据请求的Promise(而非直接存数据),避免异步加载时的竞态问题:

// 全局缓存数据请求的Promise,初始为空
let cachedDataPromise;

2. 封装缓存数据获取函数

写一个专门的函数获取数据,仅在缓存不存在时发起新请求:

async function getCachedData() {
    // 若未发起过请求,调用fetchData并缓存它的Promise
    if (!cachedDataPromise) {
        cachedDataPromise = fetchData();
    }
    // 返回缓存的Promise结果(首次调用等待请求完成,后续直接返回已加载的数据)
    return cachedDataPromise;
}

3. 修改LoadData函数,复用缓存数据

将原每次调用fetchData()的逻辑替换为getCachedData(),同时让下拉菜单初始化逻辑仅执行一次:

async function LoadData(selectedData = 0, loadThing = false) {
    // 从缓存获取数据,首次调用发起请求,后续直接复用缓存
    const data = await getCachedData();

    if (loadThing) {
        // 仅初始化时加载下拉菜单,避免重复执行
        for (let i = 0; i < 5; i++) {
            MakeCoolDropdown(data.values[dataEnum.Date][i], i);
        }
    }

    // 用缓存数据更新页面内容
    const keys = Object.keys(dataEnum);
    for (let i = 1; i < 5; i++) {
        const key = keys[i];
        PutInHtml(key, data.values[dataEnum[key]][selectedData]);
    }
}

4. 页面初始化时预加载数据

在页面加载完成后主动初始化下拉菜单,无需等待用户点击:

// 页面加载完成后,先初始化下拉菜单
document.addEventListener('DOMContentLoaded', () => {
    LoadData(0, true);
});

// 下拉菜单点击事件:仅更新页面数据,不再重复请求表格
const dropdown = document.getElementById("dropdown2_The_Movie");
dropdown.addEventListener('click', function() {
    LoadData(this.selectedIndex);
});

方案优势

  • 杜绝重复请求:cachedDataPromise缓存首次请求的Promise,后续调用不会发起新的网络请求
  • 解决异步全局变量问题:缓存Promise而非直接存数据,await会自动等待请求完成,避免数据未就绪就被使用
  • 简化函数逻辑:抽离数据请求逻辑,LoadData仅负责页面更新,不再臃肿冗余

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 04:17:05