代码之家  ›  专栏  ›  技术社区  ›  Smokey Dawson

如果再次调用函数,则取消超时/计时器— 去盎司函数

  •  2
  • Smokey Dawson  · 技术社区  · 6 年前

    我想创建一个启动超时的函数,但是如果在计时器结束之前再次调用该函数,请取消原始调用并再次启动计时器。

    我想我可以做到:

    function setTimer() {
       setTimeout(() => {
          // do something
       }, 3000)
    } 
    

    …但这不起作用,因为每次我运行setTimer(),它都不会取消原来的调用。

    3 回复  |  直到 6 年前
        1
  •  6
  •   Rafael    6 年前

    setTimeout 返回可用于清除超时的id clearTimeout() . 因此,可以在函数开始时清除现有超时。

    例如,如果您一直单击它,它将继续重新启动--如果您不单击它,它将在2秒钟内完成:

    let timerID;
    
    function setTimer() {
      console.log("starting/restarting timer")
      clearTimeout(timerID)
      timerID = setTimeout(() => {
        console.log("finished")
      }, 2000)
    }
    <p onclick="setTimer()">click to start</p>
        2
  •  3
  •   Pieter-Jan Beeckman    6 年前

    您要做的是取消现有的超时并重新开始?你可以使用 cleartimeout

    let timeoutFunctionVar = null;
    
    const setTimeoutFunction = () => {
        clearTimeout(timeoutFunctionVar)
        timeoutFunctionVar = setTimeout(() => {
            // do something
        }, 3000)
    };
    
    setTimeoutFunction()
    

    setTimeoutFunction() 被调用时,上一个超时被重置

        3
  •  2
  •   Rafael    6 年前

    我想这个问题经常被问到,特别是对于由关键事件触发的搜索,但我找不到任何问题。

    timeout id 有状态的,因此可以在后续调用to setter时清除它:

    const MS_IN_SEC = 1000;
    
    let old_timeout;
    
    function TO_setter(searchString) {
        if (old_timeout)
            window.clearTimeout(old_timeout);
    
        old_timeout = window.setTimeout(search, 2 * MS_IN_SEC, searchString);
    }
    
    function search(s) {
        console.log('search for: %s', s);
    }