1

我一直在寻找类似的问题几个小时,但无济于事。

我正在使用 Highcharts 每 3 秒更新一次图表,其中包含特定 MySQL 表的最后一个条目。我使用示例 Javascript 代码作为指导。这是我关心的代码片段

var chart;
$('#container').highcharts({
  chart: {
    type: 'spline',
    animation: Highcharts.svg, // don't animate in old IE
    marginRight: 10,
    events: {
      load: function() {
        // set up the updating of the chart every 3 seconds
        var series = this.series[0];
        setInterval(function() {
          var x = (new Date()).getTime(), // current time - adjust to align with data vals
              y = getyval();
          series.addPoint([x, y], true, true);
        }, 3000);

...函数getyval()使用的地方$.get()

function getyval(){
  $.get('testget.php', function(output){
    alert(parseFloat(output));
  });
};

我的testget.php文件:

<?php
session_start();
$db = $_SESSION['monitorId'];
$table = $_SESSION['tableId'];
$split_table = explode("_", $table);
$param = $split_table[1];

$dbcon = mysqli_connect("localhost","root","",$db);
$query = "SELECT * FROM ".$table." ORDER BY datetime DESC LIMIT 1";
$lastentry = mysqli_query($dbcon, $query) or die('error reading table');
$row = mysqli_fetch_array($lastentry, MYSQLI_ASSOC);
$yval = $row[$param];
echo $yval;    
?>

这一切都很好,并且擅长每 3 秒“提醒”最后一个值,但是当我尝试将变量分配y给这个结果时,它不起作用。例如,如果我将getyval()函数更改为:

function getyval(){
  $.get('testget.php', function(output){
    return parseFloat(output);
  });
};

提前致谢!

4

2 回答 2

0

如果您只使用 return,它将从匿名函数返回,而不是从getyval(). 第二个问题是getyval()异步的(调用后您不会收到值)。您必须更早地调用该函数,将其结果保存在某处,然后使用它。

var yValue = null;
function getyval(){
    $.get('testget.php', function(output){
      yValue = parseFloat(output);
    });
 };
于 2013-10-14T00:33:23.970 回答
0

像 AJAX 方法$.get异步的,这意味着脚本不会等待它们完成。您传递给的函数$.get 可以返回一些东西,但它有点被转储到位桶中 - 没有任何用处将它返回.

您的代码需要重新设计一点,以充分利用异步的优势。把里面的函数改成setInterval这样:

setInterval(function() {
  // current time - adjust to align with data vals
  var x = (new Date()).getTime();
  // we need to do this in here so `function(result)` can use `x`
  $.get('testget.php', function(result) {
  // this gets run when the result is received
    var y = parseFloat(result);
    series.addPoint([x, y], true, true);
  });
}, 3000);

$.get得到结果并调用它的函数时,工作就完成了,这就是你的 PHP 运行的时候。

(您可能会担心异步内容将意味着数据点可能会被乱序接收。这不会发生 - 您手动指定 x 坐标,并且每次运行外部函数时x都会创建一个新的. 每个y都将与其匹配的配对x。)

于 2013-10-14T01:06:52.323 回答