使用者互动时倒数计时器增加

时间:2018-08-01 09:21:47

标签: javascript concurrency

考虑以下C#问题:Countdown timer increase on interaction?

我需要Java的等效语言。即,以下内容:

问题

我需要在一段时间T之后调用一个回调,但是如果在回调执行之前发生了用户交互,那么这个时间T必须增加X。这是如何使用Javascript建模的?

背景(原因)

我有一个前进页面按钮,单击该按钮会将页面增加1。增加页面会导致大量计算的发生,因此最好是在一段时间后才切换页面,以使垃圾邮件用户页面按钮不会使程序性能提高。进入垃圾箱。

3 个答案:

答案 0 :(得分:1)

您可以使用反跳功能。它设置一个计时器,如果在计时器到期之前发生交互,它将删除旧计时器并创建一个新计时器,从而有效地重置时间。示例:

function debounce(fn, delay) { let timerId; return function (...args) { if (timerId) clearTimeout(timerId); timerId = setTimeout(() => { fn(...args); timerId = null; }, delay); } }

答案 1 :(得分:1)

您可以使用超时:https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout

document.getElementById("spamMe").onclick = doLongAction;

var canDoLongAction = true;
var timeout;

function doLongAction() {
  if (canDoLongAction) {
    // prevent relaunch of action
    canDoLongAction = false
    
    // the action will become available in 2sec
    timeout = window.setTimeout(
      () => {canDoLongAction = true}, 
      2000
    )
    
    // you do your long action
    alert("hey")
  } else {
  
    // if clicked while the timeout is going reset it
    window.clearTimeout(timeout);
    timeout = window.setTimeout(
      () => {canDoLongAction = true}, 
      2000
    )
    
  }
}
<button id="spamMe">spam me!!</button>

在此示例中,按钮一直处于阻塞状态,直到您停止单击2秒钟为止

答案 2 :(得分:1)

如果我理解正确,您可以清除超时并重新设置。

clearTimeout(timer);
timer = setTimeout(function(){}, 1000);

我用一个例子做了一个快速的代码笔。希望对您有所帮助:https://codepen.io/daniti/pen/gjePdo