如何在执行过程中停止功能-JavaScript

时间:2018-08-10 19:53:38

标签: javascript

如何停止/终止已经执行且仍在运行的功能?例如,我有以下功能:

function foo() {
  setInterval(function() {
    console.log("Foo Executed !");
  }, 3000);
}
foo();

现在,此foo()函数将无限期运行,当发生特定事件时,假设单击了停止按钮,那么我想停止此函数。

就我而言,该函数没有setInterval()函数。如果foo()函数没有setInterval()方法,而只是执行了很多行代码,而我想在特定事件后停止执行它,该怎么办呢?

2 个答案:

答案 0 :(得分:7)

停止正在运行的功能与您实际显示的代码有点不同,这是在启动该功能的功能之外进行的异步操作。

正在运行的功能只能从函数内部终止,这可以通过 return 语句或通过 throwing an exception来终止

可以有条件地调用

return,这样函数就不会总是在同一点退出。表单验证功能通常是这种情况--如果确定某些内容无效,则会遇到return,以便不提交表单。如果所有内容均有效,那么将跳过return并提交表单。

这是一个return的简单示例:

function foo1(){
  console.log("Foo started...");
  if(prompt("Type 1 to terminate right now or anything else to continue...") == 1){
    return;  // Function will terminate here if this is encountered
  }
  console.log("Foo ending...");  // This will only be run if something other than 1 was entered
}

foo1();

而且,这是一个抛出错误的示例(通常不执行此操作):

function foo(){
  console.log("foo started...");
  
  for(var i = 0; i < 5; i++){
    if(i === 3) { throw "I HATE 3!"; }
    console.log(i);
  }
  console.log("foo ended...");
}

foo();

但是,使用计时器和间隔,您需要调用 clearInterval() 和/或 clearTimeout() 来停止它们。这些是不同的,因为尽管某些功能可能会启动计时器或间隔,但实际计时器会作为WebAPI在JavaScript运行时环境之外运行。对于这些,我们必须向WebAPI发送一条消息,要求计时器停止计数。

您说:

  

现在,此foo()函数将在特定时间   事件发生,假设单击了停止按钮,那么我想   停止此功能。

但是foo并非无限运行。它运行一次,然后终止。然后大约3秒钟后,计时器要求它再次运行,然后再次终止,依此类推。 功能运行不一致,间隔计时器(调用该函数的WebAPI)运行。

  

如果foo()函数没有setInterval()方法,该怎么办,   但是只有几行代码可以执行,我想停止它   从特定事件发生后执行。

您的问题似乎暗示您想在发生另一个事件时停止当前正在执行的功能。由于JavaScript是一个单线程环境,因此在JavaScript中实际上不可能发生这种情况。只有在处理完所有其他代码之后,才能引发和处理任何事件。因此,除非我们正在谈论异步代码,否则确实不可能有您提到的情况。异步代码是在JavaScript运行时之外运行的代码。使用这种代码,您可以向正在处理该外部代码的WebAPI发送一条消息,您希望取消/中止该外部代码,这就是我们调用clearInterval()时所做的事情。

参见下文:

document.getElementById("start").addEventListener("click", startInterval);
document.getElementById("stop").addEventListener("click", stopInterval);

// You'll need a variable to store a reference to the timer
var timer = null;

function startInterval() {
  // Then you initilize the variable
  timer = setInterval(function() {
    console.log("Foo Executed!");
  }, 1500);
}

function stopInterval() {
  // To cancel an interval, pass the timer to clearInterval()
  clearInterval(timer);
}
<button type="button" id="start">Start</button>
<button type="button" id="stop">Stop</button>

答案 1 :(得分:0)

为此,请在您要终止进程的位置使用(^:once fn* ...)