我有两个PHP脚本。一个充当后端,并包含一个类定义,其中包含一些函数,用于显示计算机的平均负载和RAM使用情况。另一个充当前端,它调用这些函数并将它们与一些HTML和CSS一起打印以使其看起来不错。这样可以正常工作,但除非您刷新页面,否则它不会自动更新。
我使后端能够一次返回一个函数的JSON表,使用以下代码:
<?php
if (!empty ($_GET['q']))
{
$status = new status();
$query = $_GET['q'];
$data = $status->$query();
exit (json_encode($data));
}
?>
我使用JavaScript接收数据:(我没有使用任何框架)
function update_load()
{
var prefix = "Load average: ";
xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function()
{
if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
{
var json = JSON.parse(xmlhttp.responseText);
document.getElementById("loadavg").innerHTML = prefix + json.load;
}
}
xmlhttp.open("GET", "./backend.php?q=load", true);
xmlhttp.send();
setTimeout ("update_load()", 10000);
}
页面提供的JSON响应有效:
{"model":"Intel Xeon 5150 @ 2.66GHz","load":"0.00 0.02 0.05"}
我有另一个功能update_ram()
几乎完全相同并且在同一时间运行。这两个函数都在页面加载时运行,并且通常在第一次运行时正常工作。有时候,其中一个(通常是负载平均值)将停止工作,而是显示“未定义”,并且永远不会再次自我更新。我为这两个函数添加了alert (xmlhttp.response)
,后端脚本看起来就像是将update_ram()
的表发送到两个函数。
我尝试在页面加载时将其中一个函数延迟一秒,所以现在这个问题不常发生,但它仍然会发生。我想我可以让它一次性返回我想要的功能,但是它会失去一些可重用性。可能导致这种情况的原因以及可以采取哪些措施来解决这个问题?
或者,我应该采取完全不同的方式吗?
答案 0 :(得分:1)
如果您使用相同的全局xmlhttp
变量来保存对两个XmlHttpRequests的引用,那么自然会有一个状态转换操作被混淆。使用
function update_load()
{
var xmlhttp ;
...
答案 1 :(得分:1)
您正面临范围问题,因为xmlhttp
进入全局对象只需在声明中添加var
即可解决您的问题,例如:
var xmlhttp = new XMLHttpRequest();
或您的onreadystatechange
处理程序不使用xmlhttp
,而是使用this
关键字:
xmlhttp.onreadystatechange = function()
{
if (this.readyState == 4 && this.status == 200)
{
var json = JSON.parse(this.responseText);
document.getElementById("loadavg").innerHTML = prefix + this.load;
}
}