2015-08-14 108 views
0

未定義在xhr帖子上返回。我不知道問題在哪裏返回屬性(XHR)上未定義

var d=new XMLHttpRequest(); 
var data; 
d.open("POST",b,!0); 
d.setRequestHeader("Content-type","application/json"); 
d.onreadystatechange=function(){ 
if(d.readyState==4){ 
    var data={status:d.status,text:d.responseText}; 
    return data.text; // this return undefined 
    } 
}; 
d.send(c); 

回答

0

所以首先你爲什麼要從onreadystatechange返回一些東西? Onreadystatechange是一個回調函數,如果你明確使用它(例如var foo = d.onreadystatechange();),你將不會有任何響應尚未處理。你究竟如何使用該返回值?

其次,我不確定您的語法對於條件「4 == d.readystate;」是否正確我可能是錯的,但我認爲你必須使用if語句。

第三你也應該確保d.status == 200。如果d.readystate == 4,則請求已完成,但不一定成功。您仍然需要檢查以確保請求的HTTP狀態爲200 OK。

如果我不清楚,我很抱歉。這整個事情已經寫在手機上。讓我知道你是否需要一些例子。希望這可以幫助!

0

由於您正在執行異步XMLHttpRequest,因此無法從onreadystatechange回調中返回值。相反,您必須使用該回調中的結果或調用其他函數並將結果傳遞給它。從該回調中返回一個值,只需將其返回到XHR引擎的內部 - 它永遠不會進入您的代碼。

此外,您需要確保readyState === 4(表示請求已完成)並且您有成功的響應代碼,或者您需要處理錯誤代碼。下面看看如何:

var d = new XMLHttpRequest(); 
d.open("POST", url, true); 
d.setRequestHeader("Content-type","application/json"); 
d.onreadystatechange = function(){ 
    // if request has finished 
    if (this.readyState === 4){ 
     // if request finished successfully 
     if (this.status === 200) { 
      // process this.responseText here 
     } else { 
      // process this.status error response code here 
     } 
    } 
    } 
}; 
d.send(data); 

此外,一個字符變量不會使您的代碼更具可讀性。強烈建議您爲所有變量使用有意義的名稱。代碼可以在部署前用最小化器縮短,同時保留用於編輯和維護的可讀版本。