Отмена тайм-аута / таймера, если функция вызывается снова --- функция отмены - PullRequest
0 голосов
/ 18 сентября 2018

Я хочу создать функцию, которая запускает тайм-аут, но если функция вызывается снова, до окончания таймера отмените исходный вызов и снова запустите таймер.

Я думал, что смогу сделать:

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

... но это не работает, каждый раз, когда я запускаю setTimer (), он не отменяет исходный вызов.

Кто-нибудь может указать мне правильное направление?

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

Что вы хотите сделать, это отменить существующее время ожидания и начать его заново? Вы можете сделать это, используя cleartimeout

let timeoutFunctionVar = null;

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

setTimeoutFunction()

Таким образом, каждый раз, когда вызывается setTimeoutFunction(), предыдущий таймаут сбрасывается

0 голосов
/ 18 сентября 2018

Я подумал, что этот вопрос часто задают, особенно при поиске, инициированном ключевыми событиями, но я не смог его найти.

Основная идея состоит в том, что вы сохраняете идентификатор тайм-аута с состоянием, так что вы можете очистить его при последующих вызовах для установщика TO:

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);
}
0 голосов
/ 18 сентября 2018

setTimeout возвращает идентификатор, который можно использовать для очистки этого тайм-аута с помощью 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>
...