日期:2014-05-16  浏览次数:20816 次

服务器响应同步问题

//创建ajax请求对象
function createXml() {
if( window.XMLHttpRequest ) {
return new XMLHttpRequest();
} else if( window.ActiveXObject ) {
return new ActiveXObject("Microsoft.XMLHTTP");
}
}

//发送请求
function sendAjax(url, mode) {
var xmlHttp=createXml();
if(xmlHttp) {
xmlHttp.open("GET", url, true);
xmlHttp.onreadystatechange = function(){ callback(xmlHttp, mode); };
xmlHttp.send(null);
}
}
//回传方法
function callback(xmlHttp, mode) {
if(xmlHttp.readyState==4) {
if(xmlHttp.status==200) {
showResult(xmlHttp, mode);
}
}
}
//显示检测结果
function showResult(xmlHttp, mode) {
var rtnVal = xmlHttp.responseXML.getElementsByTagName("rtnVal")[0].firstChild.data;
if(mode=="check") {
if(rtnVal=="NAME_EXISTS") {
document.getElementById("txtData").value="该用户名已被注册";
} else if( rtnVal=="NAME_AVAILABLE") {
document.getElementById("txtData").value="";
}
} else if(mode=="fetch") {
salt=rtnVal;
}
}

function doTest() {
var url = "RegisterServlet?name=abcdefg";
document.getElementById("txtData").value="检测中...";
sendAjax(url, "check");
alert(document.getElementById('txtData').value=='');
//setTimeout("alert(document.getElementById('txtData').value=='');",1000);
}


在doTest()方法中,如果不延时alert结果就是false,延时alert才是true。。。我猜测是因为不延时的话,从服务器来的结果还没来得及更新到txtData中。

问题:
(1)可以从理论上给我讲一下这具体是怎么一个原理吗?
(2)如何才能实现,在接收到服务器的返回值更新到txtData中后再alert(除了用延时的方法)?

------解决方案--------------------
xmlHttp.open("GET", url, true); 这是异步的

   document.getElementById("txtData").value="检测中...";
    sendAjax(url, "check");  //异步取,不等请求返回就往下执行了
    alert(document.getElementById('txtData').value==''); //这时值还是 "检测中..."

 alert(document.getElementById('txtData').value==''); 这句放到 showResult 里最后 就行了