SetTimeout多次调用函数如何避免

时间:2018-09-25 12:12:58

标签: javascript jquery ajax

我有2个setTimeout函数,该函数调用2个不同的函数,但是在某些情况下,从setTimeout调用函数会发生多次,因此不确定如何解决此问题将不胜感激。我使用此脚本在网页上查找用户的空闲时间,并将空闲时间更新到数据库。

window.onmousemove = resetTimer('y');
window.onload = resetTimer('y');
window.onmousemove = resetTimer('y');
window.onmousedown = resetTimer('y');
window.onmouseup = resetTimer('y');
window.ontouchstart = resetTimer('y');
window.onclick = resetTimer('y');
window.onkeypress = resetTimer('y');
window.onscroll = resetTimer('y');
var t;

function resetTimer(v) {
  clearTimeout(t);
  if (v == 'y') {
    t = setTimeout(Ytimepop, 4000);
  }
  if (v == 'z') {
    t = setTimeout(Ztimepop, 5000);
  }
}

function Ytimepop() {
  // ajax code
  resetTimer('z');
}

function Ztimepop() {
  // ajax code
}

在窗口鼠标悬停和其他事件上,我调用了一个函数,该函数将调用resetTimer('y')并开始计算Ytimepop计时器,并且该函数被多次调用,而Ztimepop计时器也是如此。

2 个答案:

答案 0 :(得分:0)

您应该使用

var t;
window.onmouseover = function() {
  resetTimer('y');
}
function resetTimer(v) {
    clearTimeout(t);
    // --- rest of your code                     
}

不清楚您要使用onmouseover还是onmousemove

答案 1 :(得分:0)

此代码段出现问题:

window.onmousemove = resetTimer('y');

从本质上讲,您正在做的事情与此类似:

let returnValue = resetTimer('y'); // resetTimer executed, returns `undefined`
window.onmousemove = returnValue; // Also `undefined`

在此初始调用之后,您的resetTimer再也不会执行,更不用说mousemove了。因此,只需将其包装另一个函数即可以传统方式调用resetTimer

window.onmousemove = function(){ resetTimer('y'); };

或使用新的arrow function

window.onmousemove = () => resetTimer('y');