var returnValue = null;
xmlhttp = createXmlHttp();
xmlhttp.onreadystatechange = function() {
if(xmlhttp.readyState == 4 && xmlhttp.status == 200) {
if (xmlhttp.responseText == "true") {
returnValue = "true";
}
else {
returnValue = "false";
}
}
};
xmlhttp.open("Post",url,true); //非同步傳輸
xmlhttp.setRequestHeader("If-Modified-Since","0"); //不緩衝Ajax
xmlhttp.send(sendStr);
return returnValue;
在非同步時才可以用xmlHttpReq.onreadystatechange狀態值!下面是非同步和同步的不同調用方式:
Java代碼
xmlHttpReq.open("GET",url,true);//非同步方式
xmlHttpReq.onreadystatechange = showResult; //showResult是回呼函數名
xmlHttpReq.send(null);
function showResult(){
if(xmlHttpReq.readyState == 4){
if(xmlHttpReq.status == 200){
******
}
}
}
Java代碼
xmlHttpReq.open("GET",url,false);//同步方式
xmlHttpReq.send(null);
showResult(); //showResult雖然是回呼函數名但是具體用法不一樣~
function showResult(){
//if(xmlHttpReq.readyState == 4){ 這裡就不用了,直接dosomething吧~
//if(xmlHttpReq.status == 200){
******//dosomething
//}
//}
}
xmlhttp.open("Post",url,true);
如果是同步(false),傳回值是true或false,因為執行完send後,開始執行onreadystatechange,程式會等到onreadystatechange都執行完,取得responseText後才會繼續執行下一條語句,所以returnValue一定有值。
如果是非同步(true),傳回值一定是null,因為程式執行完send後不等xmlhttp的響應,而繼續執行下一條語句,所以returnValue還沒有來的及變化就已經返回null了。
http://te343.w3.sh.cn/blog/view.aspx?blogid=82
所有如果想獲得xmlhttp傳回值必須用同步,非同步無法得到傳回值。
同步非同步使用xmlhttp池時都要注意:取得xmlhttp時只能建立xmlhttp,不能從池中取出已用過的xmlhttp,因為被使用過的xmlhttp的readyState為4,所以同步非同步都會send但不執行onreadystatechange。