循环中带有ajax的同步请求

时间:2013-06-19 20:38:06

标签: php javascript ajax synchronous

我有一个包含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>";   
            }
        }
    }

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:0)

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