2011-12-20 150 views
2

这是一个示例动态更新的图表: http://www.highcharts.com/demo/dynamic-update如何使用AJAX获取数据并将其存储在JavaScript变量中?

图表每秒更新一次与该日期作为x值和一个随机数作为y值。

load: function() {    
    // set up the updating of the chart each second 
    var series = this.series[0]; 
    setInterval(function() { 
     var x = (new Date()).getTime(), // current time 
      y = Math.random(); 
     series.addPoint([x, y], true, true); 
    }, 1000); 
} 

我将如何改写load使用AJAX,而不是在函数内部产生的值来从另一个网页xy

+0

我需要调用服务器页面更新x和y – Corey 2011-12-20 03:48:53

+0

的价值和服务器页面本身的一个实例的实例 – Corey 2011-12-20 03:49:13

+0

[传递PHP变量返回的JavaScript变量原来页面上的Ajax]的可能重复(http://stackoverflow.com/questions/7083998/passing-php-variables-back-to-javascript-variables-on-original-page-as-ajax) – outis 2011-12-20 10:33:42

回答

3

我想你想要什么样load方法,但与设置xy与AJAX调用替换线。您需要执行相当基本的continuation-passing代码转换,将您希望异步调用的位置之后的代​​码转换为传递给异步调用的函数。 “Continuation”仅仅意味着“计算的其余部分,从给定的点向前”。在代码示例中,这是对series.addPoint的调用。这个模式是你变换:

function f(...) { 
    (1) 
    result = sync(...); 
    (2) 
} 

到:

function f(...) { 
    (1) 
    async(..., function (result) { 
      (2) 
     }); 
} 

如果(2)在原函数返回一个值,然后f通话也必须使用延续传递风格改写,增加一个额外的参数来保持延续。

您应该做的另一件事是确保PHP脚本将数字对输出为有效的JSON,可以作为两个数字的数组(可以在解析后直接传递给series.addPoint调用),也可以作为属性“x”和“y”。

请注意,由于网络通信的性质,数据可能无法及时到达,从而导致具有不规则间隔的图形。

这里的要点是将异步调用的功能组合成一个名为ajaj的函数。该示例假设浏览器支持XMLHttpRequestJSON解析器的必要标准。

/* Asynchronous Javascript And Json */ 
function ajaj(url, succeed, fail) { 
    if (! fail) { 
     fail = function() {}; 
    } 
    var xhr = new XMLHttpRequest; 
    xhr.open('GET', url); 
    xhr.onreadystatechange = function() { 
     if (xhr.readyState==4) { 
      if (200 <= xhr.status && xhr.status < 300) { 
       succeed(JSON.parse(xhr.responseText)); 
      } else { 
       // error 
       fail(xhr.status, xhr.statusText, xhr.responseText); 
      } 
     } 
    }; 
    xhr.send(); 
    return xhr; 
} 

... 

    url: '...', 

    load: function() { 
     // ensure only one data load interval is running for this object 
     if (this.updateInterval) { 
      return; 
     } 
     // set up the updating of the chart each second 
     var series = this.series[0]; 

     this.updateInterval = setInterval(function() { 
      ajaj(this.url, 
       function(point) { // success 
        series.addPoint(point, true, true); 
       }, 
       function(status, statusText, response) { // failure 
        ... 
       } 
      ); 
     }, 1000); 
    } 

JS库提供了自己的ajaj版本,往往更多的功能。如果您为生产网站做任何复杂的事情,请考虑采用一个。如果你正在使用jQuery(作为标签建议),你可以,例如,使用jQuery.get

load: function() { 
     if (this.updateInterval) { 
      return; 
     } 
     // set up the updating of the chart each second 
     var series = this.series[0]; 

     this.updateInterval = setInterval(function() { 
      jQuery.get(this.url, 
       function(point, textStatus, jqXHR) { // success 
        series.addPoint(point, true, true); 
       }, 'json' 
      ); 
     }, 1000); 
    } 

的东西服务器端是死的简单。 time()返回一个Unix时间戳,rand()返回一个(非常)伪随机数(尽管对于演示足够好),并且json_encode(),那么你可以弄清楚。

<?php 
header('Content-type: application/json'); 

echo json_encode(
     array(
      time(), 
      rand()/getrandmax(), 
     )); 
+0

+1对于这个答案超越和超越 – 2011-12-20 15:39:55

1

我想你想setTimeout递归调用:

function update(series){ 
    var x = (new Date()).getTime(), // current time 
     y = Math.random(); 
    series.addPoint([x, y], true, true); 
    setTimeout(function() { update(series); }, 1000); 
} 

然后:

load: function() {    
    var series = this.series[0]; 
    update(series); 
} 

或者更好的是,尝试这样的事情:

function update(){ 
    var series = yourChart.series[0]; 
    var x = (new Date()).getTime(), // current time 
     y = Math.random(); 
    series.addPoint([x, y], true, true); 
    setTimeout(update, 1000); 
} 

然后:

load: update 

编辑

如果你想获得一个随机数作为一个整数,这样的事情应该这样做(取决于你想要的号码的范围)

Math.floor(Math.random() * 10) 

随机将返回范围[0,1)中的数字,楼层将切断任何小数点。

random docs

+0

对不起,这不正是我所期待的。我需要代码来动态地设置每秒x和y的值。我真正需要看到的是如何发送请求并将响应以x或y形式保存为int – Corey 2011-12-20 03:50:47

+0

@ user475160 - 请参阅我的编辑 – 2011-12-20 03:58:23

+1

@ user475160 Adam似乎有一个相当不错的方法;请记住,只要你使用Ajax(和setTimeout),你的问题的“每一秒”部分就是最好的估计。网络条件和setTimeout的性质将使秒到精度成为不可能的任务。 – 2011-12-20 04:01:08

相关问题