从两个接口获取版本值并对比时变量未定义问题求助
问题分析与解决建议
问题根源
你代码里的$.getJSON是异步HTTP请求——浏览器会在后台发起请求,同时继续执行后续代码。当if (window.Lversion === window.Cversion)这段判断逻辑执行时,两个请求还没完成,Lversion和Cversion根本没被赋值,所以始终返回undefined。
解决方案
必须等两个异步请求都完成后,再执行版本对比逻辑。推荐用Promise.all统一处理请求完成状态,修改后的脚本代码如下:
<script> // 将getJSON封装为Promise const fetchLatestVersion = () => { return new Promise((resolve, reject) => { $.getJSON("https://api.github.com/repos/3kh0/3kh0.github.io/releases/latest", (data) => { const version = data.tag_name; document.getElementById("tag_name").innerText = version; resolve(version); }).fail(reject); }); }; const fetchCurrentVersion = () => { return new Promise((resolve, reject) => { $.getJSON("about.json", (cur) => { const version = cur.version; document.getElementById("version").innerText = version; resolve(version); }).fail(reject); }); }; // 等待两个请求全部完成后执行对比 Promise.all([fetchLatestVersion(), fetchCurrentVersion()]) .then(([Lversion, Cversion]) => { if (Lversion === Cversion) { console.log("Up to date! " + Cversion); document.getElementById("uptodate").innerText = "Yes"; } else { console.warn("Out of date, latest version: " + Lversion); document.getElementById("uptodate").innerText = "No"; } }) .catch((error) => { console.error("获取版本信息失败:", error); document.getElementById("uptodate").innerText = "Error"; }); </script>
替代方案(jQuery原生方法)
也可以用jQuery自带的$.when()处理多个异步请求,逻辑和Promise.all一致:
$.when(fetchLatestVersion(), fetchCurrentVersion()) .done((Lversion, Cversion) => { if (Lversion[0].tag_name === Cversion[0].version) { console.log("Up to date! " + Cversion[0].version); document.getElementById("uptodate").innerText = "Yes"; } else { console.warn("Out of date, latest version: " + Lversion[0].tag_name); document.getElementById("uptodate").innerText = "No"; } }) .fail((error) => { console.error("获取版本信息失败:", error); document.getElementById("uptodate").innerText = "Error"; });
内容的提问来源于stack exchange,提问作者Echo
相关产品推荐
相关产品推荐

