Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中停止执行带有延迟的实时图形打印_Javascript_Settimeout_Cleartimeout - Fatal编程技术网

在javascript中停止执行带有延迟的实时图形打印

在javascript中停止执行带有延迟的实时图形打印,javascript,settimeout,cleartimeout,Javascript,Settimeout,Cleartimeout,我是JavaScript新手,而且我仍然习惯于它的工作方式。我有一个函数,可以绘制实时图形,该图形通过从数据库查询中获取数据不断更新,使用以下代码完成: watch = setTimeout(function() { updateGraph(parameters, ...); },updateTimeInterval); 图形更新需要一些时间来执行,当然这也取决于updateTimeInterval的值。例如,如果updateTimeInterval设置为1000 ms

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

    watch = setTimeout(function() {
    updateGraph(parameters, ...);
    },updateTimeInterval);
图形更新需要一些时间来执行,当然这也取决于updateTimeInterval的值。例如,如果updateTimeInterval设置为1000 ms,则在8 s(平均值)内使用新值更新绘图,而如果updateTimeInterval设置为5000 ms,则在15 s内更新绘图

此更新会一直进行,直到按下停止按钮停止打印过程

    function stopPlotting() {
    clearTimeout(watch);
    }
只有在正确的时刻按下停止按钮,即在setTimeout内开始执行功能之前,此功能才能正常工作。在我看来,由于执行此功能的延迟,事情变得更加复杂。 很自然,我们希望绘图只需按下停止按钮即可自动停止,而无需等待“正确”的时刻。有没有办法用JavaScript实现这一点?我找不到解决这个问题的办法。谢谢

编辑:

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

编辑2:

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

然而,一个新的问题出现了:如果现在我想从一开始就重新绘制图表,这是不可能的。这是因为标志的值已经更改,并且在updateGraph()函数中它将始终返回false,因此不会打印任何内容。你对此有什么提示吗

编辑3:

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

一旦启动超时函数,船就已经航行了。超时功能仅适用于触发函数,而不控制它们

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


updateGraph()
中发生了什么?您可以在
stopPlotting()
中设置一个标志,并在
updateGraph()
中的各个位置检查它,如果需要,可以退出。1000毫秒应该是1秒。这是怎么回事?应该是
setInterval
,以重复从数据库获取信息。请解释。@SlipperyPete您能给我一个例子,说明如何在stopPlotting()中设置标志并在updateGraph()中检查它吗?这是否意味着我需要在updateGraph()中调用stopPlotting()?@PHPglue,这个过程是重复执行的,我只是在这里给出了我的代码的一小部分,来解释逻辑。您提出的解决方案没有setTimeout()和clearTimeout()?问题是绘制图形应该无限继续,直到有人按下停止按钮。我不知道如何将其包含在updateGraph()函数中。您仍然保留超时函数,因为您必须无限次地运行绘图。您的问题是,一旦打印功能运行,清除超时将不会停止打印功能。把暂停想象成一名足球运动员。你可以告诉他不要踢球。但是一旦他踢了球,他就无法阻止球了。除非球里有什么东西能让它停下来。
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)
}