【问题标题】:Stop executing a real time graph plot with delay in javascript停止在javascript中延迟执行实时图表
【发布时间】:2014-09-04 17:25:32
【问题描述】:

我是 JavaScript 新手,但我仍在习惯它的工作方式。我有一个绘制实时图表的函数,该图表通过从数据库查询中获取数据来不断更新,使用以下代码完成:

    watch = setTimeout(function() {
    updateGraph(parameters, ...);
    },updateTimeInterval);

图表更新需要一些时间来执行,当然这也取决于 updateTimeInterval 的值。例如,如果 updateTimeInterval 设置为 1000 毫秒,则绘图会在 8 秒(平均)内更新为新值,而如果设置为 5000 毫秒,则绘图会在 15 秒内更新。

此更新一直发生,直到按下停止绘图过程的停止按钮。

    function stopPlotting() {
    clearTimeout(watch);
    }

只有在正确的时刻按下停止按钮时才能正常工作,即在 setTimeout 内开始执行函数之前。在我看来,由于执行此功能的延迟,事情变得更加复杂。 自然地,人们希望只需按下停止按钮即可自动停止绘图,而无需等待“正确”的时刻。有什么方法可以用 JavaScript 实现吗?我找不到任何解决这个问题的方法。谢谢!

编辑:

updateGraph() 是一个从数据库中检索数据的函数。一旦获得数据,该函数就会使用最新信息重绘(更新)图形。这会根据 setTimeout 指定的时间延迟连续发生。该图表将永远更新,直到有人按下该停止按钮。

编辑 2:

我在 updateGraph() 函数的几个地方设置了一个标志,如果标志的值发生变化,则返回 false。在 clearTimeout() 之前的 stopPlotting() 函数中更改了标志的值。这实际上起到了作用,图表的绘制停止了。

但是,出现了一个新问题:如果现在我想从头开始重新绘制图形,这是不可能的。这是因为标志的值已经改变了,它在 updateGraph() 函数中总是返回 false,所以什么都不会被绘制。你对此有什么提示吗?

EDIT3:

提示是在 stopPlotting() 函数中更改另一个布尔变量,并在 updateGraph() 中检查值是否已更改(如果已更改,则替换标志的值)。这将允许您从头开始绘制图表多次。 附言布尔变量和标志都被声明为全局变量。

【问题讨论】:

  • updateGraph() 会发生什么?您可以在stopPlotting() 中设置一个标志,并在updateGraph() 内的各个位置进行检查,如果需要,请退出。
  • 1000 毫秒应该是一秒。那是怎么回事?
  • 应该是setInterval 重复从数据库中获取信息。请解释一下。
  • @SlipperyPete 你能给我一个例子,说明如何在 stopPlotting() 中设置标志并在 updateGraph() 中检查它吗?这是否意味着我需要在 updateGraph() 中调用 stopPlotting()?
  • @PHPglue,这个过程是重复执行的,我这里只是给出了我的一小部分代码,说明逻辑。

标签: javascript settimeout cleartimeout


【解决方案1】:

一旦触发超时功能,船就航行了。超时功能仅适用于触发功能,而不是控制它们。

如果您想停止该函数,您可以使用在脚本的时间敏感部分检查的变量(即 ajax 调用)。

var running = true;
function dummy(){
   if( ! running) return false;
   runThis();
   if( ! running) return false;
   runThat();
   //finish when there's no interference (running is set to false)
}

【讨论】:

  • 您提出的解决方案是否没有 setTimeout() 和 clearTimeout()?问题是绘制图形应该无限地继续,直到有人按下停止按钮。我不确定如何将它包含在我的 updateGraph() 函数中。
  • 您仍然保留超时功能,因为您必须无限运行您的绘图。您的问题是,一旦您的绘图功能正在运行,那么清除超时不会停止您的绘图功能。把超时想象成一名足球运动员。你可以告诉他不要踢球。但是一旦他踢了球,他就无法阻止球了。除非球里有什么东西让它停下来。
猜你喜欢
  • 2018-02-25
  • 1970-01-01
  • 2021-01-21
  • 2011-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多