2011-08-06 58 views
0

我有两个PHP脚本。一个用作后端,并包含一个类定义,其中包含一些功能,用于显示计算机的平均负载和RAM使用情况。另一个用作前端,它调用这些函数并将它们与一些HTML和CSS一起打印,以使它看起来很好。这工作正常,但它不会自动更新,除非刷新页面。PHP JSON返回两个不同函数的一个响应

我做后端能够一次返回一个函数的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()的表发送给这两个函数。

我试着在页面加载时延迟了一秒钟的功能,所以现在这个问题发生的频率较低,但仍然会发生。我想我可以让它一次返回我想要的功能,但是它会失去一些可重用性。什么可能导致这一点,以及可以采取哪些措施来解决这个问题?

或者,有没有完全不同的方式我应该这样做?

回答

1

如果您使用相同的全局变量xmlhttp来保存对两个XmlHttpRequests的引用,那么很自然会对statechange动作之一产生混淆。使它成为一个局部变量,而不是

function update_load() 
{ 
    var xmlhttp ; 
    ... 
+0

当然。我不能相信我忽略了这一点。谢谢 – ZeroUptime

1

您所面临的范围问题,因为xmlhttp进入简单地增加你的声明中var全局对象将解决您的问题,如:

var xmlhttp = new XMLHttpRequest(); 

或在您的onreadystatechange处理程序不使用xmlhttpthis关键字,如:

xmlhttp.onreadystatechange = function() 
{ 
    if (this.readyState == 4 && this.status == 200) 
    { 
    var json = JSON.parse(this.responseText); 
    document.getElementById("loadavg").innerHTML = prefix + this.load; 
    } 
}