3

真の値が返されるまでajaxリクエストを呼び出そうとしています。次のコードを試しましたが、コンソールに結果やエラーが返されません。私が間違っていることについて何か考えはありますか?

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);
4

3 に答える 3

5

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();
于 2012-11-20T04:46:47.543 に答える
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();
}
于 2012-11-20T04:47:14.177 に答える
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);
于 2012-11-20T04:49:23.327 に答える