如何在按下按键时暂停/播放 Javascript 循环?

发布于 2024-11-14 21:49:15 字数 477 浏览 1 评论 0原文

使用 Javascript/jQuery,如何暂停(或恢复)以下 当按下“P”键时循环

(function() {
   var arr = [...],
       len = arr.length;


   (function doProcess(i) {
       if (i) {
            console.log(len - i);
           /* do something with arr[len - i] */
           setTimeout(function() { doProcess(--i); }, 20000);
       }
   })(len);    
})();

Using Javascript/jQuery, how can I pause (or resume) the following loop when the "P" key is pressed?

(function() {
   var arr = [...],
       len = arr.length;


   (function doProcess(i) {
       if (i) {
            console.log(len - i);
           /* do something with arr[len - i] */
           setTimeout(function() { doProcess(--i); }, 20000);
       }
   })(len);    
})();

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

情感失落者 2024-11-21 21:49:15

暂停和恢复相当复杂。您真正需要做的是:

  1. 启动一个进程并存储其超时 ID。
  2. 存储运行该过程的时间。
  3. 按键时,使用超时 ID 清除超时。
  4. 将未完成的时间存储在另一个变量中。
  5. 下次按键时,使用未完成的时间设置超时。
  6. 将以下超时设置为原始预期延迟。

这是我编写的一个更通用的 jsFiddle 示例

var counterOn = true;
var delay = 3000; 
var lastRun;
var tempDelay;
var intervalId;

function decrementCounter() {
  // do something
  lastRun = new Date();
  timeoutId = setTimeout(decrementCounter, delay);
}

function toggleCounter() {
  var curTime = new Date();
  counterOn = !counterOn;
  if (counterOn) {
    lastRun = curTime.valueOf() + tempDelay - delay;
    timeoutId = setTimeout(decrementCounter, tempDelay);
  } else {
    clearTimeout(timeoutId);
    tempDelay = delay - (curTime.valueOf() - lastRun);
  }
}

$(document).keydown(function(e) {
  if (e.which === 80) {
    toggleCounter();
  }
});

decrementCounter();

Pausing and resuming is fairly complex. What you really have to do is this:

  1. Start a process and store its timeout ID.
  2. Store the time when you ran that process.
  3. On keypress, clear the timeout using its timeout ID.
  4. Store the unfinished time in another variable.
  5. On next keypress, set the timeout using that unfinished time.
  6. Set the following timeouts to the original intended delay.

Here's a more generalized jsFiddle example I whipped up.

var counterOn = true;
var delay = 3000; 
var lastRun;
var tempDelay;
var intervalId;

function decrementCounter() {
  // do something
  lastRun = new Date();
  timeoutId = setTimeout(decrementCounter, delay);
}

function toggleCounter() {
  var curTime = new Date();
  counterOn = !counterOn;
  if (counterOn) {
    lastRun = curTime.valueOf() + tempDelay - delay;
    timeoutId = setTimeout(decrementCounter, tempDelay);
  } else {
    clearTimeout(timeoutId);
    tempDelay = delay - (curTime.valueOf() - lastRun);
  }
}

$(document).keydown(function(e) {
  if (e.which === 80) {
    toggleCounter();
  }
});

decrementCounter();
看轻我的陪伴 2024-11-21 21:49:15

您需要跟踪计时器已经过去了多少时间(请参阅此处:javascript:pause setTimeout() ;)并对您想要停止的任何事件调用clearTimeout,然后在再次触发任何取消暂停的事件后再次调用setTimeout,并保留剩余时间。

You'll want to keep track of how much time has passed with your timer (see here: javascript: pause setTimeout();) and call clearTimeout on whatever event you want to stop, then call setTimeout again with your remaining time left once whatever event unpauses is fired again.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文