JQuery $.get请求失败进入Catch块,报错$.get不是函数求助
搞定你的jQuery请求问题:从
$.get is not a function到异步逻辑修正 先解决你眼前最头疼的TypeError: $.get is not a function问题:
你说已经在HTML里引入了jQuery,但还是报这个错,大概率逃不过这几个原因:
- 你用的是jQuery Slim版:Slim版本特意砍掉了Ajax相关的方法(包括
$.get、$.ajax这些),如果你的引入链接里带了/slim/,比如https://code.jquery.com/jquery-3.7.1.slim.min.js,那肯定用不了$.get。换成完整版本就行,比如https://code.jquery.com/jquery-3.7.1.min.js。 $被其他库抢了:如果页面里还加了Prototype、Zepto这类也用$当标识符的库,会把jQuery的$覆盖掉。这时候可以直接用jQuery.get()代替$.get(),或者给jQuery换个名字:var jq = jQuery.noConflict(); jq.get(...) // 用jq代替$调用方法- jQuery根本没引入成功:别光说引入了,打开浏览器控制台的「网络」面板看看,jQuery的请求是不是返回404?或者直接在控制台输入
jQuery或者$,如果返回undefined,那就是真的没加载成功,检查一下引入路径有没有写错。
接下来是你代码里的隐形坑(就算jQuery没问题,原代码也跑不对):
你的getBalance函数有两个致命的异步逻辑问题:
- try/catch抓不到异步错误:
$.get是异步操作,它的错误不会在当前的try块里抛出来,你之前看到的catch触发其实是因为$.get不存在的同步错误。要处理异步请求的失败,得用$.get自带的错误回调,或者用Promise写法(jQuery的Ajax方法都返回Promise对象)。 - 还没拿到数据就return了:
$.get是异步的,当你执行return balance的时候,请求还在后台跑呢,balance还是一开始的undefined,根本拿不到服务器返回的结果。
给你改好的代码,用Promise风格更直观(适合新手理解异步逻辑):
function getBalance() { // 返回一个Promise对象,调用方通过.then/.catch处理结果 return new Promise((resolve, reject) => { // 用jQuery.get避免$被覆盖的问题 jQuery.get("https://[censored]-backend-system.glitch.me/balance/", {login: username}) .done((data) => { console.log(data); resolve(data); // 请求成功,把余额数据传递出去 }) .fail((error) => { console.log("请求失败:", error); reject(error); // 请求失败,传递错误信息 }); }); } // 调用这个函数的正确姿势: getBalance() .then((balance) => { console.log("拿到余额啦:", balance); // 这里写拿到余额后的逻辑,比如渲染到页面上 }) .catch((error) => { console.log("出问题了:", error); // 这里处理请求失败的情况,比如提示用户 });
如果更习惯用回调的写法(贴近你原来的思路),可以改成这样:
function getBalance(callback) { // 传入一个回调函数来接收结果 try { jQuery.get("https://[censored]-backend-system.glitch.me/balance/", {login: username}, (data) => { console.log(data); callback(null, data); // 成功时把数据传给回调 }).fail((error) => { console.log("请求失败"); callback(error, null); // 失败时把错误传给回调 }); } catch (err) { console.log("同步错误:", err); callback(err, null); } } // 调用方式: getBalance((error, balance) => { if (error) { console.log("出错了:", error); return; // 或者返回0之类的默认值 } console.log("当前余额是:", balance); // 后续逻辑都在这里写 });
最后给你这个jQuery新手提个小醒:
- 写异步代码的时候,千万别想着「直接return异步结果」,异步操作不会等它完成才往下走,一定要用回调、Promise或者async/await来处理后续逻辑。
- 遇到jQuery方法找不到的问题,先去控制台确认
jQuery对象存在不,以及对应的方法是不是真的有(比如输入jQuery.get,返回function就没问题)。
内容的提问来源于stack exchange,提问作者IdiotJS
相关产品推荐
相关产品推荐

