2015-07-12 48 views
0

我試圖運行這個,但它不起作用。 它旨在返回一個在函數內部分配的變量,該變量作爲回調函數傳遞給sendRequest(),該函數通過異步方式通過XMLHttpRequest從Internet檢索數據。JavaScript變量不能用XMLHttpRequest更改

誰能告訴我爲什麼這不起作用,總是返回「」?

function sendRequest(requestCode, args, callback){ 
 
\t var req = requestEngineUrl + "?req=" + requestCode + ";" + args; 
 
\t var xmlHttp = new XMLHttpRequest(); 
 
\t xmlHttp.onreadystatechange = function(){ 
 
\t \t if(xmlHttp.readyState == 4) 
 
\t \t { \t 
 
\t \t \t if(callback != null){ 
 
\t \t \t \t callback(xmlHttp.responseText); 
 
\t \t \t } 
 
\t \t } 
 
\t }; 
 
\t xmlHttp.open("GET", req, true); 
 
\t xmlHttp.send(null); 
 
}

this.assembleProcess = function(){ 
 
\t \t if(!isNull(this.id) && !isNull(this.titles)){ 
 
\t \t \t var titles = this.titles; 
 
\t \t \t var id = this.id; 
 
\t \t \t c = ""; 
 
\t \t \t sendRequest('304', id, 
 
\t \t \t \t function(result){ 
 
\t \t \t \t \t var res = result.split("/"); 
 
\t \t \t \t \t var title = res[0]; 
 
\t \t \t \t \t var possibilities = res[1]; 
 
\t \t \t \t \t var fcontent = title + '<br><div>'; 
 
\t \t \t \t \t \t if(titles.length != possibilities){ 
 
\t \t \t \t \t \t \t console.log("WARNING: [SURVEYCARD].titles has not the same length as possibilities"); 
 
\t \t \t \t \t \t } 
 
\t \t \t \t \t 
 
\t \t \t \t \t \t for(i = 0; i < possibilities; i++){ 
 
\t \t \t \t \t \t \t fcontent += '<div><a onclick="sendRequest("301",' + id + ',' + i + ',null)">' + titles[i] + '</a></div>'; 
 
\t \t \t \t \t \t } 
 
\t \t \t \t \t 
 
\t \t \t \t \t fcontent += '</div>'; 
 
\t \t \t \t \t c = fcontent; 
 
\t \t \t \t }); 
 
\t \t \t return c; 
 
\t \t }

+2

過程是** **同步。發送給'sendRequest()'函數的回調函數將在HTTP請求完成時被調用。 'alert(c)'語句在那段時間之前已經達到* long *。 – Pointy

+0

有沒有辦法做到這一點? – aprofomo

+0

是的 - 你已經傳遞了一個回調函數。當回調運行時,內容將可用,並且您可以執行您需要的任何工作。這就是在異步環境中使用回調進行編程的本質。 – Pointy

回答

1

作爲一個XMLHttpRequest是異步,你應該寫一個異步功能,對於這個問題,像這樣的

this.assembleProcess = function(callback){ 
     if(!isNull(this.id) && !isNull(this.titles)){ 
      var titles = this.titles; 
      var id = this.id; 
      c = ""; 
      sendRequest('304', id, 
       function(result){ 
        var res = result.split("/"); 
        var title = res[0]; 
        var possibilities = res[1]; 
        var fcontent = title + '<br><div>'; 
         if(titles.length != possibilities){ 
          console.log("WARNING: [SURVEYCARD].titles has not the same length as possibilities"); 
         } 

         for(i = 0; i < possibilities; i++){ 
          fcontent += '<div><a onclick="sendRequest("301",' + id + ',' + i + ',null)">' + titles[i] + '</a></div>'; 
         } 

        fcontent += '</div>'; 
        c = fcontent; 
        callback(c) 
       }); 
     } 

,然後,而不是使用this.assembleProcess與結果的功能,你應該通過一個函數作爲參數:

代替

console.log(this.assembleProcess); 

做到這一點

this.assembleProcess(function(c){console.log(c)});