如果If条件为True,请使用SetInterval

时间:2016-01-16 11:34:52

标签: javascript php core

这是否可能如果 $ new 的值被更改,则var updateChart函数再次重新加载,然后再次转到 var check function < / strong>并且再次具有相同的条件。

var updateInterval = 3000;
  var updateChart = function() {
      var check = function() {
        if(<?php echo $new; ?>).change(function(){
          setInterval(function(){updateChart()}, 1000);
        });
      }
    dps.push(<?php echo $str; ?>);
    chart.render();   
};

将不胜感激 感谢。

1 个答案:

答案 0 :(得分:1)

所以基本上你想在服务器端写入一些值后立即更新图表,对吧?正如我的评论中所提到的,在JS块中使用PHP语句将不起作用,因为PHP代码将在页面加载时运行,之后不会更改。相反,您应该使用两步法:

  • 使用定期的AJAX调用来轮询更改
  • 创建报告更改的PHP页面

JS代码(使用Jquery):

window.setInterval(function() {
  $.ajax('change-listener.php', {
    success: function(data) {
      if (data.changed) {
        for(var i in data.newValue) {
          dps.push(data.newValue[i]);
        }
        chart.render();
      }
    }
  });
}, 3000); 

检查在给定时间范围内写入的行(假设您正确记录的表具有时间戳)并通过JSON将相应的值返回给JS脚本:

PHP代码:

$query= 'SELECT strValue FROM [YOURTABLE] WHERE created > DATE_SUB(now(),INTERVAL 3 SECOND)';

$data= array();
if ($result = $mysqli->query($query)) { 
    if (mysqli_num_rows($result)) {
        $data['changed']= TRUE;
        while($obj = $result->fetch_object()){ 
            $data['newValues'][]= $obj->strValue;
        } 
    } else {
        $data['changed']= FALSE;
    }
} 
$result->close();

header('Content-Type: application/json');
print json_encode($data);

另一种方法是将新创建的值存储在用户会话中:

PHP代码,第1部分(在处理新值存储的脚本中):

session_start();    
$_SESSION['newValues'][]= $str;

PHP代码,第2部分(而不是轮询数据库,轮询会话):

session_start();  
if (isset($_SESSION['newValues'])) {
  $data['changed']= TRUE;
  $data['newValues']) $_SESSION['newValues'];
  unset($_SESSION['newValues'];
} else {
  $data['changed']= FALSE;
}

第二种方法是纯粹的单用户场景:只要PHP脚本轮询更改,就会返回一次更改,然后重置更改列表,永远不会返回相同的值两次。