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

如何仅在数据未加载时调用fetch,避免重复下载JSON数据集

问题原因

  • 判断逻辑写反:go函数内data.length > 0的分支反而执行了fetch(),和你要实现的“没数据才请求”逻辑完全颠倒
  • 初始请求位置错误:fetch写在全局作用域,页面一加载就会自动发送请求,不是点击按钮时才触发
  • 没有处理异步时序问题:如果用户点击按钮时请求还没返回,直接访问data[0]会抛出异常
  • fetch()没有传任何参数,属于无效调用

修正后的实现代码

JavaScript 代码

let arr = [[0,"Bulbasaur"],[1,"Ivysaur"],[2,"Venusaur"],[3,"Charmander"],[4,"Charmeleon"]]
let output = document.getElementById('output')
for (var key in arr) {
    let button = document.createElement('button')
    button.innerHTML = arr[key][1]
    button.addEventListener('click', go)
    button.setAttribute('data-key', arr[key][0])
    output.append(button)
}

// 存储请求到的数据集,初始为空
let pokedexData = null

async function go() {
    // 仅首次点击无数据时才发起请求
    if (!pokedexData) {
        console.log('首次加载数据集')
        const res = await fetch("https://raw.githubusercontent.com/Biuni/PokemonGO-Pokedex/master/pokedex.json")
        pokedexData = await res.json()
    } else {
        console.log('复用已有数据集,不重复请求')
    }
  
    const key = this.dataset.key
    document.getElementById('img').setAttribute('src', pokedexData.pokemon[key].img)
}

HTML 代码

<img id="img" src=""/>
<div id="output"></div>

优化说明

  • 直接用变量存储解析后的JSON对象,不需要用数组包裹,访问逻辑更简洁
  • 请求逻辑移到点击事件内部,只有首次无数据时才发起请求,后续点击直接复用缓存数据
  • 用async/await处理异步逻辑,避免数据未加载完成就访问的报错问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:51:01