Как правильно сбросить время ожидания? - PullRequest
0 голосов
/ 17 октября 2018

поэтому у меня есть такая функция:

function blabla(){
    ...

    setTimeout(() => {
        //do some stuff
    }, 10000) 
}   

сейчас. Как я могу сбросить время ожидания (10000), если функция была вызвана и время ожидания еще не закончено?
Iпопытался убить тайм-аут, если он существует следующим образом:

function blabla(){
    ...

    if(to){
       clearTimeout(to)
    } 

    let to = setTimeout(() => {
        //do some stuff
    }, 10000) 
}  

, но я получаю ошибку, что to не определено.так что это правильный способ проверить, существует ли таймаут или нет.Есть ли лучший способ сделать это?

Ответы [ 3 ]

0 голосов
/ 17 октября 2018

Не очень хорошая идея использовать для этого глобальную переменную, потому что она не может быть повторно использована.Лучше написать обертку для этой функции, потому что это общий шаблон.Этот нативный код или пакет npm для этого

Функции Debounce включены во многие библиотеки JavaScript.Цель каждой реализации состоит в том, чтобы уменьшить накладные расходы, предотвращая вызов функции несколько раз подряд.Независимо от библиотеки все функции debounce построены на собственной функции JavaScript setTimeout.

https://www.npmjs.com/package/debounce:

function debounce(func, wait, immediate) {
    let timeout;
    return function() {
        let context = this,
            args = arguments;
        let later = function() {
            timeout = null;
            if (!immediate) func.apply(context, args);
        };
        let callNow = immediate && !timeout;
        clearTimeout(timeout);
        timeout = setTimeout(later, wait);
        if (callNow) func.apply(context, args);
    };
};

var blabla = debounce(function(){
     console.log(5)
}, 5000);
blabla()
blabla()
0 голосов
/ 17 октября 2018

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

0 голосов
/ 17 октября 2018

Вам просто нужно объявить to перед if, чтобы оно существовало при запуске if (и оно не определено).Вам не нужно придавать ему фактическое значение до тех пор, пока позже.

На самом деле, вы, вероятно, захотите объявить его вне функции, поэтому он будет сохраняться при следующем вызове функции.

Вот пример запускаемой программы.Обратите внимание, что несмотря на двойной вызов blablah (), вы видите «hello» только один раз, потому что второй вызов функции отменил исходное время ожидания.

var to;

function blabla() {
  //...

  if (to) {
    clearTimeout(to)
  }

  to = setTimeout(() => {
    //do some stuff
    console.log("hello");
  }, 10000)
}

blabla();
blabla();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...