关于AJAX调用,得到返回值总为undefined的疑问

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于AJAX调用,得到返回值总为undefined的疑问相关的知识,希望对你有一定的参考价值。

现在有一个功能模块,需要实现在2秒内使用AJAX去获取2个页面内容,现在问题是,ajax函数在其函数内部,读取的xml.responseText很正常,但是一被主函数main调用上去后,就显示undefined,(个人感觉由于AJAX的异步获取数据的特性,需要等到客户端页面加载完毕后才可以返回值,而程序运行快,是不会等待什么的,所以中间有一个时间差导致MAIN函数中总是无法获取数值),由于是个AJAX新手,还请各位大虾帮忙,能说的详细点,不知道大家有什么解决方案。
<script type="text/javascript">
var ajax1;
//主函数整体思路
function main()
var ajaxhtml_1=ajax2("a.asp");
alert(ajaxHtml_1);//显示undefined
//此处为对ajaxHtml_1内容进行处理

var ajaxHtml_2=ajax2("b.asp");
alert(ajaxHtml_2);//显示undefined
//此处为对ajaxHtml_2内容进行处理

var SendTimer=window.setTimeout(main(),2000);
xml.send();

//ajax声明
function createXMLHttps()
var ret = null;
try ret = new ActiveXObject('Msxml2.XMLHTTP')
catch (e)
try ret = new ActiveXObject('Microsoft.XMLHTTP')
catch (ee) ret = null

if (!ret&&typeof XMLHttpRequest !='undefined') ret = new XMLHttpRequest();
return ret;

//被调用函数
function Ajax2(URL)
var ajax1;
var xml = createXMLHttps();
xml.open("POST",URL,true);//此处如果用false的话即同步,下面所有alert都显示undefined
xml.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xml.send();
xml.onreadystatechange = function()
if (xml.readyState == 4)
ajax1=xml.responseText;
alert(ajax1);//此处添加打印出来结果正常

alert(ajax1);//此处添加打印出undefined
return ajax1;

</script>
感谢大家的帮助,特别感谢 pzl7758 朋友帮忙想办法,问题已得到解决。
暂时没有办法能控制住在xml.onreadystatechange执行完毕后立即将xml.responseText值赋给ajax1,所以main函数执行调用到此处时,xml.responseText可能还未获取到数据就直接被返回到main函数中做处理了,因而会得到undefined.
解决办法:main函数中增加使用循环调用两个页面
function main()
for (var i=1;i<=2;i++)
Ajax2(web_list(i));

var SendTimer=window.setTimeout("main()",2000);

增加网址列表
function web_list(web_no)
switch (web_no)
case 1:
var chk_url="a.asp";
break;
case 2:
var chk_url="b.asp";
break;

return chk_url;


在被调用函数Ajax2中的xml.onredystatechange=function()中使用处理数据代码进行处理,同样使用循环,这样在其内部作处理,程序会在xml.responseText获取数据后再进行赋值处理,这样就不会返回undefined了。
if (xml.readyState == 4)
switch (URL)
case "a.asp":
数据处理过程。。。;
break;
case "b.asp":
数据处理过程。。。;
break;

在函数Ajax2中,楼主采用了异步调用ajax,所以,当代码执行到"return ajax1"时,xml.onreadystatechange还没激发,那么ajax1肯定是undefined。

而比较常用的做法是在onreadystatechange中的激发状态是“返回成功”时调用其他函数来处理返回结果。你可以想像成,当“返回成功”时,激发一个事件,这个事件用来处理结果。
参考技术A 之前没遇到过类似问题,也没试过,现在我去测一下,有问题可以给我留言

经测试,楼主这样写应该是不可行的,因为你不能保证在return ajax1时, xml.onreadystatechange已经激发并完成ajax1=xml.responseText;的动作,如果楼主能找出控制xml.onreadystatechange状态的办法还差不多,否则就只能交由系统去判断了.本回答被提问者采纳
参考技术B 是这样的,回调函数中尽管你申明的是匿名函数,但他内部的ajax1变量和你ajax2中声明的ajax1是两个独立的变量,除非你把这个ajax1提到所有的函数外面作为一个全局变量,否则你在回调函数中的改变是影响不了外面的。

以上是关于关于AJAX调用,得到返回值总为undefined的疑问的主要内容,如果未能解决你的问题,请参考以下文章

求解关于java ajax值一直都是undefined的问题

求解关于java ajax值一直都是undefined的问题

mvc从前台发送ajax请求得到的数据显示未定义(undefined),哪位帮忙看看

js数组操作大全

ajax服务器返回html文本,请求页面获取为啥会得到undefined

scrollTop总为零原因;如何查看滚动条的位置或者说滚动条的滚动距离(待完善)