我正在尝试调用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 :(得分:5)
getUserData
在内部调用异步函数,因此它在AJAX调用实际完成之前就已经返回了很长时间。
您可能希望在失败的情况下再次尝试调用getUserData
,而不是在setInterval循环中执行此操作。例如:
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();
答案 1 :(得分: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();
}
答案 2 :(得分: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);