2012-11-20 35 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);