0

我有一个包含 ajax 请求的 for 循环。该请求正在异步工作。所以我无法及时得到请求的结果。我怎样才能在不使用任何库的情况下解决这个问题?谢谢。

    var availables = document.getElementsByClassName("available");

    for(var i=0;i<availables.length;i++){
        var element = availables[i];

        var xmlhttp;
        if(window.XMLHttpRequest)
            xmlhttp = new XMLHttpRequest;
        else
            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");

        xmlhttp.open("GET", "control.php?user=" + element.innerText, true);
        xmlhttp.send();

        xmlhttp.onreadystatechange = function(){
            if(xmlhttp.readyState == 4 && xmlhttp.status == 200){
                var result = xmlhttp.responseText;
                console.log(result);

                element.setAttribute("class" , "result available " + result);
                if(result == "online")
                    element.innerHTML = "<a href=\"http://twitter.com/" + element.innerText + "\">" + element.innerText + "</a>";   
            }
        }
    }
4

2 回答 2

2

首先,我建议在执行 xmlhttp.open 和 xmlhttp.send 之前放置 xmlhttp.onreadystatechange 函数。它可能正在发送和返回,并且由于它是异步运行的,因此在您可以定义/执行 onreadystatechange 函数之前它会返回。类似的东西。

无论如何,您始终可以通过将 xmlhttp.open 中的最后一个参数设置为 false 来同步完成所有操作。这将使 javascript 在 xmlhttp.send 之后等待,然后再继续,但无论哪种方式,您仍然需要在打开和发送之前放置 onreadystatechange。

    var availables = document.getElementsByClassName("available");

for(var i=0;i<availables.length;i++){
    var element = availables[i];

    var xmlhttp;
    if(window.XMLHttpRequest)
        xmlhttp = new XMLHttpRequest;
    else
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");

    xmlhttp.onreadystatechange = function(){
        if(xmlhttp.readyState == 4 && xmlhttp.status == 200){
            var result = xmlhttp.responseText;
            console.log(result);

            element.setAttribute("class" , "result available " + result);
            if(result == "online")
                element.innerHTML = "<a href=\"http://twitter.com/" + element.innerText + "\">" + element.innerText + "</a>";   
        }
    }

    xmlhttp.open("GET", "control.php?user=" + element.innerText, true);
  //xmlhttp.open("GET", "control.php?user=" + element.innerText, false); //If you want to do it synchronously
    xmlhttp.send();
}
于 2013-06-19T20:42:02.767 回答
0

同步进行 ajax 调用是非常糟糕的做法,xmlhttp.open("GET", "control.php?user=" + element.innerText, true)因为在 ajax 请求结束之前您无法与应用程序交互。onreadystatechange我认为在您的情况下,最好在前一个的回调中发送每个下一个请求。

于 2013-06-19T20:49:50.860 回答