并行ajax调用 - 无法从第一个接收响应

时间:2013-11-04 10:17:41

标签: javascript ajax

我正在实施一个小“ping”实用程序来检查我们的两台服务器是否在线。

这是javascript代码:

var t1, t2, t3, t4;

function jsContactServers() {
    ajaxServerStatusWWW();
    ajaxServerStatusAPPS();
}

function ajaxServerStatusWWW() {
    try {                   
        if (window.XMLHttpRequest) {
            xmlhttp = new XMLHttpRequest();
        } else {
            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        }

        var t1 = setTimeout(function() {
            xmlhttp.abort();
            clearTimeout(t1);
            ServerIsDown("www");
        }, 7000);
        xmlhttp.onreadystatechange = function() {           
            if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
                var strOut;
                strOut = xmlhttp.responseText;
                console.log("www:" + strOut);
                if (strOut == "1") {
                    clearTimeout(t1);
                    document.getElementById("divwww").innerHTML = "www : UP";
                    document.getElementById("divwww").style.background = "green";
                    pauseSound("alarm_internet");
                    pauseSound("alarm_server");
                    setTimeout(ajaxServerStatusWWW, 10000);
                }
            }
        }
        console.log("www");
        xmlhttp.open("GET","http://www.mydomain.com/contactserver.php?IP=1.2.3.4",true);
        xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
        xmlhttp.send();
    }
    catch(err) {
        alert(err);
    }
}

function ajaxServerStatusAPPS() {
    try {                   
        if (window.XMLHttpRequest) {
            xmlhttp = new XMLHttpRequest();
        } else {
            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        }

        var t2 = setTimeout(function() {
            xmlhttp.abort();
            clearTimeout(t2);
            ServerIsDown("apps");
        }, 7000);
        xmlhttp.onreadystatechange = function() {           
            if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
                var strOut;
                strOut = xmlhttp.responseText;
                console.log("apps:" + strOut);
                if (strOut == "1") {
                    clearTimeout(t2);
                    document.getElementById("divapps").innerHTML = "apps : UP";
                    document.getElementById("divapps").style.background = "green";
                    setTimeout(ajaxServerStatusAPPS, 10000);
                }
            }
        }
        console.log("apps");
        xmlhttp.open("GET","http://www.mydomain.com/contactserver.php?IP=4.3.2.1",true);
        xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
        xmlhttp.send();
    }
    catch(err) {
        alert(err);
    }
}

contactserver.php尝试读取IP GET参数中声明的服务器中的.php文件,如果可以读取php文件(服务器已启动),则返回“1”。

现在问题是,我收到了来自

的回复
ajaxServerStatusAPPS();

但我

完全没有回复
ajaxServerStatusWWW();

[console.log("www:" + strOut);不会开火]

但是,如果我最初只调用ajaxServerStatusWWW()而不是两者,它可以正常工作。如果我通过更改

拨打电话同步而不是异步,它也能正常工作
xmlhttp.open("...", true) ;

xmlhttp.open("...", false);

我在这个过程中遗漏了什么?为什么会这样?

1 个答案:

答案 0 :(得分:2)

你正在成为The Horror of Implicit Globals的牺牲品:你没有声明xmlhttp,所以它是一个隐含的全局,因此对ajaxServerStatusAPPS的调用会覆盖调用{{}}的值。 {1}}存储在该变量中。两个函数都尝试使用相同的变量。

ajaxServerStatusWWWajaxServerStatusWWW内,使用ajaxServerStatusAPPS声明变量,以便它们各自拥有自己的变量。

在现代浏览器上,您可以使用“严格”模式将此操作设为错误而不是隐式全局。在严格模式下分配给未知标识符时,它会导致var而不是创建全局。