2014-11-22 87 views
0

當我打電話的XMLHttpRequest:空響應

var zzz = new XMLHttpRequest(); 
zzz.open('GET', "http://freegeoip.net/json/", true); 
zzz.send(); 
console.log(zzz); 

在控制檯日誌中我可以看到responseresponseText。但是,當我打電話

console.log(zzz.response); 

我看到類似的反應""。我錯過了什麼?我如何獲得json?

+0

我認爲服務器超載,瀏覽器等待響應很長時間。 – Cheery 2014-11-22 22:55:47

回答

0

true in zzz.open('GET', "http://freegeoip.net/json/", true);表示請求是異步的。這意味着您需要等待請求完成。當第三個參數被設置爲true

var zzz = new XMLHttpRequest(); 
zzz.open('GET', "http://freegeoip.net/json/", true); 
zzz.onload = function(){ 
    console.log(zzz.response); 
    if (zzz.status === 200){ 
     // Probably good to make the you got a success code. 
    } 
}; 
zzz.onerror = function(err){ 
    // Handle the error 
}; 
zzz.send(); 
0

XMLHttpRequest對象異步完成其請求。這意味着瀏覽器在繼續之前不會等待答案。在您調用send()函數後,請求尚未完成,您將無法訪問結果。

JavaScript處理這些的方式是告訴對象如何處理某個函數。從here翻錄的代碼,你要的是這樣的:

function reqListener() { 
    console.log(this.responseText); 
} 

var oReq = new XMLHttpRequest(); 
oReq.onload = reqListener; 
oReq.open("get", "yourFile.txt", true); 
oReq.send(); 
0

你沒有看到的結果,因爲這不僅是在默認情況下請求的異步 - 你手動設置它是異步的。將async標誌(第三個參數爲.open())設置爲false,而您會得到您所期望的行爲。


但是,正如@itdoesntwork指出的那樣,使用同步請求是非常糟糕的做法。正如其他答案中所示,最好使用異步請求並正確處理其結果。

+2

確實如此,但這會鎖定瀏覽器,一般不建議使用 – itdoesntwork 2014-11-22 22:58:58

+0

是的,當然。這只是把海報帶到他想去的地方的最小變化。無論他是否進入深淵,完全是另一回事:) – hon2a 2014-11-22 23:01:15