我正在实施一个小“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);
我在这个过程中遗漏了什么?为什么会这样?
答案 0 :(得分:2)
你正在成为The Horror of Implicit Globals的牺牲品:你没有声明xmlhttp
,所以它是一个隐含的全局,因此对ajaxServerStatusAPPS
的调用会覆盖调用{{}}的值。 {1}}存储在该变量中。两个函数都尝试使用相同的变量。
在ajaxServerStatusWWW
和ajaxServerStatusWWW
内,使用ajaxServerStatusAPPS
声明变量,以便它们各自拥有自己的变量。
在现代浏览器上,您可以使用“严格”模式将此操作设为错误而不是隐式全局。在严格模式下分配给未知标识符时,它会导致var
而不是创建全局。