我有两个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()
的表发送到两个函数。
我尝试在页面加载时将其中一个函数延迟一秒,所以现在这个问题发生的频率降低了,但它仍然会发生。我想我可以让它一次返回我想要的所有函数,但这样就会失去一些可重用性。是什么导致了这种情况,我们可以做些什么来解决它?
或者,我应该用完全不同的方式来做这件事吗?
如果您使用相同的全局xmlhttp
变量来保存对两个xmlhttprequest的引用,那么自然地,其中一个statechange动作将会被混淆。用
function update_load()
{
var xmlhttp ;
...
您正面临作用域问题,因为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;
}
}