2012-11-20 34 views
3

我想調用一個ajax請求,直到它返回一個真正的值。我已經嘗試了下面的代碼,但它不會在控制檯中返回任何結果和錯誤。任何想法我做錯了什麼?重複函數,直到true

function getUserData() { 
var xhr = new XMLHttpRequest(); 
xhr.open("GET", "http://api.example.com/data.json", true); 
xhr.onreadystatechange = function() { 
    if (xhr.readyState == 4) { 
    var resp = JSON.parse(xhr.responseText); 
    return resp.status; 
    } 
} 
xhr.send(); 
} 

setInterval(function() { 
if (getUserData() === "true") { 
    alert("true"); 
} 
}, 10000); 
+0

這將(嘗試)每10秒發送一次XHR,直到時間結束。 –

+0

你期待什麼結果? –

回答

4

getUserData內部調用異步函數,所以在AJAX調用實際上是完成了它返回長。

而不是在setInterval循環中這樣做,你可能想在失敗的情況下再次嘗試調用getUserData。例如:

function getUserData() { 
    var xhr = new XMLHttpRequest(); 

    xhr.open("GET", "http://api.example.com/data.json", true); 
    xhr.onreadystatechange = function() { 
     if (xhr.readyState == 4) { 
      var resp = JSON.parse(xhr.responseText); 
      if (resp.status) { 
       alert("true"); 
      } else { 
       setTimeout(getUserData, 10000); 
      } 
     } 
    } 
    xhr.send(); 
} 

getUserData(); 
0

由於您稱之爲異步,因此無法從函數返回值。 試試這個:

function getUserData() { 
var xhr = new XMLHttpRequest(); 
xhr.open("GET", "http://api.example.com/data.json", true); 
xhr.onreadystatechange = function() { 
    if (xhr.readyState == 4) { 
    var resp = JSON.parse(xhr.responseText); 
    if (resp === "true") 
     alert("true"); 
    else 
     getUserData(); 
    } 
} 
xhr.send(); 
} 
0

是的,你的函數將立即返回,但總是會返回undefined。

由於操作是異步的,因此您需要將其重寫爲基於回調。

function getUserData(callback) { 
var xhr = new XMLHttpRequest(); 
xhr.open("GET", "http://api.example.com/data.json", true); 
xhr.onreadystatechange = function() { 
    if (xhr.readyState == 4) { 
    var resp = JSON.parse(xhr.responseText); 
    callback(resp.status); 
    } 
} 
xhr.send(); 
} 

setInterval(function() { 
var isTrue = "false"; 

while(isTrue !== "true"){ 
    getUserData(function(result){ isTrue = result }); 
} 

}, 10000);