JavaScript新手求助:如何显示对象数组属性及排查函数异常
解决宝可梦详情函数的alert阻塞问题
嘿,我来帮你搞定这个小麻烦~你说只有注释掉else块里的alert,函数才能正常处理所有宝可梦,这大概率是alert的阻塞特性或者数据加载时机不对在搞鬼,咱们一步步来捋:
先猜下你的代码大概是啥样的(常见坑)
我估计你的代码结构类似这样:
let pokedexData; // 加载宝可梦JSON数据 fetch('https://raw.githubusercontent.com/Biuni/PokemonGO-Pokedex/master/pokedex.json') .then(res => res.json()) .then(data => { pokedexData = data.pokemon; }); // 你写的查询函数 function showPokemonDetails(name) { let isFound = false; for (let poke of pokedexData) { if (poke.name.toLowerCase() === name.toLowerCase()) { // 显示详情的逻辑(比如打印到控制台) console.log(poke); isFound = true; break; } } if (!isFound) { alert('找不到这个宝可梦哦!'); // 就是这个alert搞事情 } }
问题出在哪?
1. Alert会阻塞代码执行
如果是批量测试(比如遍历所有宝可梦调用这个函数),只要有一个名称匹配失败,alert就会弹出来,必须手动点击关闭才能继续执行后续代码,这就给你一种“只有注释掉alert才能处理所有宝可梦”的错觉。
2. 数据可能还没加载完就执行了函数
如果在fetch还没把数据拿到手的时候就调用showPokemonDetails,pokedexData还是undefined,这时候遍历会直接报错,而alert的弹出可能掩盖了这个错误——注释掉alert后,你可能没注意到控制台的报错,等数据加载完成后再调用就正常了。
怎么解决?
方案1:确保数据加载完成后再执行函数
用async/await改写,让代码逻辑更清晰,避免数据未就绪的问题:
let pokedexData; // 封装加载数据的异步函数 async function loadPokedexData() { try { const response = await fetch('https://raw.githubusercontent.com/Biuni/PokemonGO-Pokedex/master/pokedex.json'); const data = await response.json(); pokedexData = data.pokemon; console.log('宝可梦数据加载完成啦!'); } catch (err) { console.error('加载数据失败:', err); } } // 先加载数据 loadPokedexData(); async function showPokemonDetails(name) { // 检查数据是否就绪,没就绪就等它加载完 if (!pokedexData) { await loadPokedexData(); } // 用Array.find()简化查找逻辑 const targetPoke = pokedexData.find(poke => poke.name.toLowerCase() === name.toLowerCase()); if (targetPoke) { // 这里可以把详情渲染到页面上,示例: const detailCard = document.createElement('div'); detailCard.style.border = '1px solid #ccc'; detailCard.style.padding = '10px'; detailCard.style.margin = '10px'; detailCard.innerHTML = ` <h3>${targetPoke.name}(#${targetPoke.num})</h3> <p>属性:${targetPoke.type.join(', ')}</p> <img src="${targetPoke.img}" alt="${targetPoke.name}" width="100"> `; document.body.appendChild(detailCard); } else { // 用控制台警告替代alert,不会阻塞代码 console.warn(`找不到名为「${name}」的宝可梦!`); // 如果一定要用alert,也可以,但批量测试时会很麻烦 // alert(`找不到名为「${name}」的宝可梦!`); } }
方案2:替换alert为非阻塞提示
如果不想改太多代码,把alert换成页面上的提示元素,比如提前在HTML里加个提示框:
<div id="alert-box" style="display:none; color: red; padding: 10px;"></div>
然后在else块里改成:
document.getElementById('alert-box').textContent = `找不到名为「${name}」的宝可梦!`; document.getElementById('alert-box').style.display = 'block'; // 3秒后自动隐藏提示 setTimeout(() => { document.getElementById('alert-box').style.display = 'none'; }, 3000);
总结
核心就是两点:
- 确保数据完全加载后再执行查询逻辑
- 避免用alert这种阻塞式的提示,换成控制台输出或页面自动提示
这样不管是单个查询还是批量测试,函数都能正常处理所有宝可梦啦~
内容的提问来源于stack exchange,提问作者Aditya Reddy
相关产品推荐
相关产品推荐

