【问题标题】:How to stop loop with delay to continue another如何延迟停止循环以继续另一个
【发布时间】:2017-03-29 17:26:01
【问题描述】:

我试图让两件事同时发生,但只允许其中一件。如果某些事情已经发生,我需要能够完全阻止它并让另一个接管。这是我的例子:

https://jsfiddle.net/mortenmoulder/5eceLvgu/

function log(text, interval, amount) {
    (function myLoop(i) {
        timer = setTimeout(function() {
            console.log(text);
            if (--i) myLoop(i);
        }, interval)
    })(amount);
}

$("#first").on("click", () => log("first", 500, 10));
$("#second").on("click", () => log("second", 500, 10));

单击第一个按钮,它将console.log("first") 10 次,延迟 500 毫秒。当您单击第二个按钮时,它应该取消第一个并启动console.log("second") 而不会被中断(除非您单击第一个按钮)。

我该怎么做?我需要延迟循环,并且我需要一个函数来执行此操作(因此每个按钮都没有很多 if 语句,因为有很多按钮)。

【问题讨论】:

标签: javascript node.js


【解决方案1】:

如果你调用log,你需要存储定时器id并清除它:

var logTimer;

function log(text, interval, amount) {
  clearTimeout(logTimer);
  (function myLoop(i) {
    logTimer = setTimeout(function() {
      console.log(text);
      if (--i) myLoop(i);
    }, interval)
  })(amount);
}

【讨论】:

  • 嗯,这真的很奇怪。我以前这样做过,但没有用。道歉。
  • Aaaaaaaaaah 我不小心写了 clearInterval。该死。
【解决方案2】:

您已经在存储计时器,因此您可以清除它的超时时间。

https://jsfiddle.net/5eceLvgu/1/

var timer;
function log(...)
    clearTimeout(timer);
    (function myLoop(i) {

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-15
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 2012-12-25
    • 2015-06-26
    相关资源
    最近更新 更多