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

现在有一个功能模块,需要实现在2秒内使用AJAX去获取2个页面内容,现在问题是,ajax函数在其函数内部,读取的xml.responseText很正常,但是一被主函数ma... 现在有一个功能模块,需要实现在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;
}
}
展开
 我来答
雪归冬
2009-10-22 · 超过14用户采纳过TA的回答
知道答主
回答量:32
采纳率:0%
帮助的人:0
展开全部
在函数Ajax2中,楼主采用了异步调用ajax,所以,当代码执行到"return ajax1"时,xml.onreadystatechange还没激发,那么ajax1肯定是undefined。

而比较常用的做法是在onreadystatechange中的激发状态是“返回成功”时调用其他函数来处理返回结果。你可以想像成,当“返回成功”时,激发一个事件,这个事件用来处理结果。
pzl7758
2009-10-22 · TA获得超过603个赞
知道小有建树答主
回答量:962
采纳率:100%
帮助的人:631万
展开全部
之前没遇到过类似问题,也没试过,现在我去测一下,有问题可以给我留言

经测试,楼主这样写应该是不可行的,因为你不能保证在return ajax1时, xml.onreadystatechange已经激发并完成ajax1=xml.responseText;的动作,如果楼主能找出控制xml.onreadystatechange状态的办法还差不多,否则就只能交由系统去判断了.
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jessiejacky
2009-10-22 · TA获得超过227个赞
知道答主
回答量:107
采纳率:0%
帮助的人:0
展开全部
是这样的,回调函数中尽管你申明的是匿名函数,但他内部的ajax1变量和你ajax2中声明的ajax1是两个独立的变量,除非你把这个ajax1提到所有的函数外面作为一个全局变量,否则你在回调函数中的改变是影响不了外面的。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式