相信對於如下代碼都很熟悉。
function getData(url,obj)
{
var xh;
xh = new ActiveXObject("Microsoft.XMLHTTP");
xh.onreadystatechange = function(){
if(xh.readyState==4)
{
if(xh.status==200){
return xh.responseText;
}
else{
return '';
}
}
}
xh.open("GET", url+"?direct=wk2d&d="+obj.value, false);
xh.send();
}
可是不管裡面怎麼調整它,裡面使用Ajax或者XMLHTTP對象來非同步擷取資料,我們會發現在調用getData("aa.asp",object1)時,發現返回的值總是undefined。
這個是因為非同步擷取資料導致的問題,在程式中調用getData()函數,在xh發出send指令後,程式並不會等待返回結果而阻塞,而是立刻繼續執行主程式中接下來的內容,這個時候主程式如果想使用getData的傳回值,很可能就是undefined,因為這個時候xh對象可能還在發送請求和等待響應中,不能及時給出getData的傳回值。
那怎麼來解決這個問題? 可以想辦法在主程式中在執行了getData函數後,就將程式阻塞直到得到傳回值。修改後的代碼如下:
var data;
var got;
function getDateURL(url,obj)
{
var xh;
got=false;
xh = new ActiveXObject("Microsoft.XMLHTTP");
xh.onreadystatechange = function(){
if(xh.readyState==4)
{
if(xh.status==200){
data=xh.responseText;
got=true;
}
else{
data='';
got=true;
}
}
}
xh.open("GET", url+"?direct=wk2d&d="+obj.value, false);
xh.send();
}
而js主程式中加入阻塞內容:
getData("aaa.asp",object);
while(!got){
; //這裡就可以將程式阻塞直到got為true代表擷取到資料。
}
value=data;
希望有用。