При написании дебаунса какой смысл в clearTimeout?

   debounceFunction() {
        let timeout = setTimeout(() => {
            doSomething();
            flag = true;
            clearTimeout(timeout);
        }, 250);
    }

Я написал функцию устранения дребезга, которая выглядит так, как показано выше, я вызывал эту функцию несколько раз при срабатывании события. Мой вопрос: имеет ли какое-либо значение значение clearTimeout в конце setTimeout?

Каким будет оптимальный способ сделать это?

Заранее спасибо :)


person Laiacy    schedule 14.03.2018    source источник
comment
clearTimeout отменяет добавление этой задачи в очередь событийного цикла, но вам нужно вызвать ее до setTimeout   -  person gurvinder372    schedule 14.03.2018
comment
Как насчет удаления вызова clearTimeout и повторного тестирования?   -  person Andreas    schedule 14.03.2018
comment
Если не нарушать setTimeout при выполнении, нет необходимости вызывать clearTimeout в конце.   -  person Heng Lin    schedule 14.03.2018


Ответы (3)


Имеет ли смысл clearTimeout в конце setTimeout?

Нет, нет смысла вызывать clearTimeout из обратного вызова setTimeout — там уже поздно. Вы ничего не можете очистить, тайм-аут уже произошел.

clearTimeout используется, когда вы хотите предотвратить вызов обратного вызова до, когда это произойдет.

Каким будет оптимальный способ сделать это?

Просто пропустите это.

Если вы спрашиваете об оптимальном способе написания debounce, см. может ли кто-нибудь объяснить функцию debounce в Javascript.

person Bergi    schedule 14.03.2018

Мой вопрос в том, имеет ли смысл clearTimeout в конце setTimeout?

Нет, clearTimeout используется для сброса ранее созданного тайм-аута, поэтому clearTimeout должно быть выполнено до setTimeout, чтобы отменить предыдущий вызов setTimeout.

Каким будет оптимальный способ сделать это?

Посмотрите сообщение Дэвида Уолша и ТАК вопрос

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

clearTimeout() предотвращает выполнение функции, установленной с помощью setTimeout(); При дебаунсинге пользователь вынужден выполнять ограниченные действия в течение определенного интервала времени. Поэтому мы устанавливаем это действие внутри функции внутри setTimeout, и всякий раз, когда пользователь пытается выполнить одно и то же действие в течение заданного интервала, мы вызываем clearTimeout, чтобы пользователь не мог этого сделать. Так что clearTimeout следует вызывать перед SetTimeout.

person Anand Verma    schedule 07.08.2020