2011-08-06 59 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; 
    } 
}