我是JavaScript新手,我仍然习惯它的工作方式。我有一个函数,它绘制一个实时图形,通过从数据库查询中获取数据来不断更新,完成以下代码:
watch = setTimeout(function() {
updateGraph(parameters, ...);
},updateTimeInterval);
图形更新需要一些时间来执行,当然还取决于updateTimeInterval的值。例如,如果updateTimeInterval设置为1000 ms,则使用8 s(每个平均值)的新值更新绘图,而如果设置为5000 ms,则绘图将在15 s内更新。
此更新发生,直到按下停止按钮,停止绘图过程。
function stopPlotting() {
clearTimeout(watch);
}
只有在正确的时刻按下停止按钮,即在setTimeout内执行函数开始之前,这才能正常工作。在我看来,由于执行此功能的延迟,事情变得更加复杂。 当然,人们希望通过按下停止按钮来自动停止绘图,而无需等待"右边"时刻。有没有办法用JavaScript实现这一点?我无法找到解决这个问题的方法。谢谢!
编辑:
updateGraph()是一个从数据库中检索数据的函数。只要有数据,该函数就会使用最新信息重新绘制(更新)图形。这是根据setTimeout指定的时间延迟连续发生的。该图表将永久更新,直到有人按下该停止按钮。
编辑2:
我在updateGraph()函数的几个地方设置了一个标志,如果标志的值发生变化,则返回false。在clearTimeout()之前,在stopPlotting()函数中更改标志的值。这实际上是诀窍,图表的绘图停止了。
然而,出现了一个新问题:如果现在我想从头开始重新绘制图形,这是不可能的。这是因为标志的值已经更改,并且它将始终在updateGraph()函数中返回false,因此不会绘制任何内容。你对此有什么暗示吗?
EDIT3:
提示是在stopPlotting()函数中更改另一个布尔变量,并在updateGraph()中检查值是否已更改(如果是,则替换标志的值)。这样可以根据需要从头开始绘制图形。 附:布尔变量和标志都被声明为全局变量。
答案 0 :(得分:0)
一旦超时的功能被触发,船就航行了。超时功能仅适用于触发功能,而不能控制它们。
如果要停止该功能,可以使用在脚本的时间敏感部分(即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)
}