问题描述
jsonResult = getDepInfoJson(Department.id); //此处调用独立的 jquery post 请求function getDepInfoJson(depId){var ret;$.post(urlHead + 'getDepInfo.action', {"departmentId":depId}, function(data, status){if("success"==status){ret = data;//alert("callBack data:" + data +" ret:"+ret);}else{$.messager.alert('系统信息',"访部服务器发生错误!",'warning');}});alert("继续ret:"+ ret);return ret;} 为什么return前必须加alert(),才能返回值,且alert()时,输出为 “ret:undefined”? 问题补充:<div class="quote_title">lackhurt 写道</div><div class="quote_div">这里你用的是异步请求,在alert弹出的时候ajax请求还没有返回<br />当alert弹出后在关闭的一段时间内,ajax请求有了返回,才把ret赋值<br /><br />改为同步请求就可以了<br /><pre name="code" class="js">function getDepInfoJson(depId){ var ret; $.ajax({ url: urlHead +"getDepInfo.act", success: function (data, status){ if("success"==status){ ret = data; //alert("callBack data:" + data +" ret:"+ret); }else{ $.messager.alert('系统信息',"访部服务器发生错误!",'warning'); } }, async: false //改为同步请求 }); return ret; } </pre><br /></div><br /><br />还是不行<br />alert("callBack data:" + data +" ret:"+ret); <br />取消注释后 data ret 什么都没打出来<br />
解决方案
不好意思 忽略了参数 function getDepInfoJson(depId){ var ret; $.ajax({ type: "POST", url: urlHead +"getDepInfo.act", data: { "departmentId":depId }, success: function (data, status){ if("success"==status){ ret = data; //alert("callBack data:" + data +" ret:"+ret); }else{ $.messager.alert('系统信息',"访部服务器发生错误!",'warning'); } }, async: false //改为同步请求 }); return ret; }
解决方案二:
Ajax是异步调用的 $.post里面那个function(data, status)是独立运行的 会被调用4次而post执行完毕 function 可以看做是启用一个线程 去和服务器通信所以 会有延迟 但不影响post 以及 getDepInfoJson的执行至于你说的alert才会有结果 其实并不是而是alert阻止了 getDepInfoJson运行 从而给了 function 足够的时间运行完毕 此时刚好带回 歪打正着 正确的做法是在function 里 定义 全局的ret来做返回值
解决方案三:
这里你用的是异步请求,在alert弹出的时候ajax请求还没有返回当alert弹出后在关闭的一段时间内,ajax请求有了返回,才把ret赋值改为同步请求就可以了function getDepInfoJson(depId){ var ret; $.ajax({ url: urlHead +"getDepInfo.act", success: function (data, status){ if("success"==status){ ret = data; //alert("callBack data:" + data +" ret:"+ret); }else{ $.messager.alert('系统信息',"访部服务器发生错误!",'warning'); } }, async: false //改为同步请求 }); return ret; }