这是动态更新的示例图表: http://www.highcharts.com/demo/dynamic-update
图表每秒更新一次,日期为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);
}
我如何使用AJAX重写load
从其他网页获取x
和y
,而不是在函数中生成值?
答案 0 :(得分:3)
我认为你想要的是样本load
方法,但是将x
和y
替换为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
的函数。该示例假定浏览器支持XMLHttpRequest和JSON解析器的必要标准。
/* 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(),
));
答案 1 :(得分: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)
random将返回[0,1]范围内的数字,并且会触发任何小数点。
请参阅random docs