【问题标题】:Use SetInterval when the If condition is True当 If 条件为 True 时使用 SetInterval
【发布时间】:2016-01-16 11:34:52
【问题描述】:

这是否有可能如果 $new 的值发生更改,那么 var updateChart 函数 会再次重新加载,然后再次进入 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();   
};

将不胜感激 谢谢。

【问题讨论】:

  • 这段代码对我来说没有任何意义:你应该知道 PHP 部分会在页面创建后立即执行并回显,因此$new 元素永远不会通过 PHP 更新。 if().change() 块将立即被触发,因为它将触发更改事件,然后执行内部代码。您正在定义一个名为 check() 的函数,但在您发布的代码中您没有执行它。
  • 是的,我在.change() 函数中遇到了问题,但是为此我如何使用这个语句,当$new 值发生变化时,这意味着 num_rows 只会增加,然后 UpdateChart 函数才会执行。
  • 我仍然不确定我是否正确地回答了你,但我会给你一个希望合适的答案。
  • 实际上我只想在我的数据库中添加行时将 $str 值推送到var dps 中。所以我只想在$new 变量上设置间隔,这样当$new Variable 更改时,推送函数只执行一次。我希望现在我对你很清楚

标签: javascript php core


【解决方案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 脚本轮询更改,更改会返回一次,然后更改列表被重置为不再返回相同的值两次。

【讨论】:

  • 感谢您提供这么好的答案,我真的很感谢您。但现在的问题是我正在为现场篮球比赛制作图表,我将时间格式呈现为[{"x":new Date(0000,00,00,00,00,30),"y":2},,如果我在 EncodeJson 中转换它,那么它呈现[{"x":"new Date(0000,00,00,00,00,30)","y":2},,画布 JS 不选择格式,所以我使用@ 987654328@ 删除双引号,然后我再次尝试渲染图表
  • 我知道这有点困难,我希望我们可以使用 TeamViewer,这样我就可以向您展示我真正遭受的痛苦。如果我们可以做 TeamViewer,请通知我。
  • 抱歉,我目前还没有安装 TeamViewer。你似乎又在混合语言,你不应该传递任何应该在接收端转换的字符串,比如eval(),这会在某些时候导致问题。而是在服务器端创建日期(即$date= new Date();)并将其与您的 JSON 数据(print json_encode(array('x' =&gt; $date, 'y' =&gt; 2));)一起传递。
猜你喜欢
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
  • 2018-10-05
  • 2016-08-14
  • 2011-09-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多