關於Microsoft.XMLHTTP或Ajax中非同步擷取資料的問題

來源:互聯網
上載者:User

相信對於如下代碼都很熟悉。

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;

希望有用。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.