【问题标题】:How to stop a function during its execution - JavaScript如何在函数执行期间停止函数 - JavaScript
【发布时间】:2021-03-23 15:51:48
【问题描述】:

如何停止/终止已执行且仍在运行的函数?比如我有这个功能:

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

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

在我的情况下,该函数没有setInterval() 函数。如果foo() 函数没有setInterval() 方法,但只有多行代码被执行,我想在特定事件后阻止它执行怎么办。

【问题讨论】:

  • 不是foo() 无限运行,它只运行一次。这是无限运行的Interval。要停止一个函数,你可以使用return; 来停止一个interval,你应该使用clearInterval。请参阅下面 Scott 的回答
  • “只是执行了很多行代码,我想在特定事件之后阻止它执行。” - 退出这样的函数只需使用return,但这与区间完全不同。

标签: javascript


【解决方案1】:

停止正在运行的函数与您实际显示的代码有点不同,这是在启动它的函数之外发生的异步操作。

正在运行的函数只能从函数内部终止,这可以通过 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 秒后,计时器调用您传递给它的匿名函数运行,然后该函数终止,大约 3 秒后,匿名函数再次运行,然后再次终止,依此类推。 函数运行不一致,interval timer(调用函数的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 到 1000,我想通过另一个由按钮触发的外部函数来停止它,例如 &lt;button type="button" id="stop"&gt;Stop&lt;/button&gt;
  • @RahulAhire 请仔细阅读我的回答。无法停止正在运行的功能。您可以做的是,而不是循环,使用setInterval() 计时器,这会导致异步回调函数重复运行,但当它运行时,它可以检查包含更高范围的变量每次计时器功能运行时都会增加的计数器(计时器功能会增加它)。当计数器达到 1000 时,回调函数可以自己调用clearInterval() - 导致重复函数不再运行。然后,您的停止按钮可以做同样的事情。
【解决方案2】:

为此在您要终止进程的地方使用return;

【讨论】:

  • 正如 Scott Marcus 上面回答的那样,简单的返回/中断不会停止间隔。需要一个 clearInterval。
  • 让我上传我的完整代码,然后你可以检查它@Michael
  • 没问题,我也犯了同样的错误(:
猜你喜欢
  • 2017-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-23
  • 1970-01-01
  • 1970-01-01
  • 2021-06-27
相关资源
最近更新 更多