JQuery Ajax调用成功后返回undefined,回调函数无法正常返回响应
为什么会出现
undefined? 这问题我之前也踩过坑!核心原因就是你说的AJAX异步特性,但得把逻辑掰明白:
你的hit_db()函数里,$.ajax是异步执行的——JS引擎调用hit_db()后,会立刻启动AJAX请求,然后不等请求完成,直接跳去执行后面的return status;。这时候AJAX还没拿到服务器响应,hit_db()自然没有返回值,所以status就是undefined。
而第二个例子里,你把alert(response)放在success回调里,这个回调是只有当AJAX请求成功拿到响应后才会触发的,所以这时候能正常弹出预期的服务器返回内容。
怎么才能正确获取并返回服务器响应?
因为异步代码的执行顺序和同步代码完全不同,你不能像写同步函数那样直接return结果,得用「异步处理逻辑」,这里给你两种常用且靠谱的方案:
方案1:用回调函数传递结果
修改hit_db,让它接受一个回调函数作为参数,在AJAX成功后把响应传给这个回调:
function handler(data) { // 这里可以按需处理数据,比如格式化、过滤等 return data; } function hit_db(callback) { $.ajax({ url: target_url, type: 'GET', async: true, crossDomain: true, success: function(response){ // 把处理后的响应传给回调函数 callback(handler(response)); } }); } // 调用时通过回调获取结果 hit_db(function(result) { alert(result); // 这里就能拿到服务器响应了 });
方案2:用Promise(更现代的写法)
jQuery的$.ajax本身返回一个Deferred对象(和原生Promise用法类似),你可以用.then()来链式处理成功后的结果:
function handler(data) { return data; } function hit_db() { // 直接返回$.ajax的Deferred对象 return $.ajax({ url: target_url, type: 'GET', async: true, crossDomain: true }); } // 调用时用.then()处理结果,还能捕获错误 hit_db() .then(function(response) { return handler(response); }) .then(function(result) { alert(result); // 这里拿到处理后的响应 }) .catch(function(error) { // 处理请求失败的情况 console.error('请求出错啦:', error); });
重要提醒
别想着把async改成false来搞同步执行——这种方式会直接阻塞浏览器,用户操作完全卡死,体验极差,而且现在很多浏览器已经限制同步AJAX的使用了,绝对不要这么做!
内容的提问来源于stack exchange,提问作者lob0
相关产品推荐
相关产品推荐

