0

我正在实现一个小“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);

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

4

1 回答 1

2

您正在成为隐式全局恐怖的牺牲品:您没有声明xmlhttp,所以它是一个隐式全局,因此调用会ajaxServerStatusAPPS覆盖调用ajaxServerStatusWWW存储在该变量中的值。两个函数都尝试使用相同的变量。

ajaxServerStatusWWWandajaxServerStatusAPPS中,使用声明变量,var以便它们各自拥有自己的变量。

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

于 2013-11-04T10:21:49.700 回答