Javascript 如果条件为真,则使用SetInterval

Javascript 如果条件为真,则使用SetInterval,javascript,php,core,Javascript,Php,Core,如果更改了$new的值,则varupdateChart函数可能会重新加载,然后再次转到var检查函数,并再次具有相同的条件 var updateInterval = 3000; var updateChart = function() { var check = function() { if(<?php echo $new; ?>).change(function(){ setInterval(function(){updateC

如果更改了$new的值,则varupdateChart函数可能会重新加载,然后再次转到var检查函数,并再次具有相同的条件

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();   
};
var updateInterval=3000;
var updateChart=函数(){
var check=函数(){
if().change(函数(){
setInterval(函数(){updateChart()},1000);
});
}
dps.push();
chart.render();
};
将不胜感激
谢谢。

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

  • 使用重复的AJAX调用轮询更改
  • 创建一个报告更改的PHP页面

JS代码(使用):

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); 
$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);
检查在给定的时间跨度内写入了哪些行(假设您的右记录表有时间戳),并通过JSON将相应的值返回到JS脚本:

PHP代码:

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); 
$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部分(在处理新值存储的脚本中):

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


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

这段代码对我来说没有任何意义:您应该知道,PHP部分在页面创建后立即执行并回显,因此
$new
元素永远不会通过PHP更新。
if().change()
块将立即被激发,因为它将触发更改事件,然后执行内部代码。您正在定义一个名为
check()
的函数,但在您发布的代码中您没有执行它。是的,我在
.change()中遇到了问题
函数但对于这一点,我如何使用这一语句,即当
$new
值更改时,这意味着只有增加了num_行数,然后才会执行UpdateChart函数。我仍然不确定是否正确,但我会给你一个希望合适的答案。实际上,我只想在
var dps中推送$str值当我在数据库中添加行时。因此,我只想在
$new
变量上设置interval,这样当
$new variable
更改时,push函数只执行一次。我希望你们现在明白了谢谢你们给了我这么好的答案我真的很感谢你们。但现在的问题是,我正在为现场篮球比赛制作图表,我将时间格式呈现为
[{“x”:新日期(0000,00,00,00,00,30),“y”:2},
,如果我将其转换为EncodeJson,那么它将呈现
[{“x”:“新日期(0000,00,00,00,00,00,30)”,“y”:2},
画布JS不选择格式,因此我使用
preg_replace
删除双引号,然后我再次尝试渲染图表我知道这有点困难,我希望我们可以使用TeamViewer,以便能够向您展示我真正的痛苦。如果我们可以使用TeamViewer,请通知我。抱歉,我目前没有TeamViewer已安装。您似乎又在混合语言了,您不应该将任何内容作为字符串传递,这些字符串应该在接收端通过
eval()
等方式进行转换,这将在某些时候导致问题。而应该在服务器端创建日期(即
$date=new date();
)并将其与JSON数据一起传递(
print JSON_encode(array('x'=>$date,'y'=>2));
)。