#javascript
#javascript
Вопрос:
В следующей throttle
функции, timeout
в конечном итоге превращается в число, поскольку оно присваивается setTimeout . Я переопределяю его, false
поскольку после его очистки код работает.
Я ничего не замечаю на первый взгляд, но интересно, есть ли какие-либо проблемы с выполнением действий таким образом или есть что-то, что я могу упустить?
const throttle = (fn, delay) => {
let timeout;
return (...args) => {
if(!timeout) {
timeout = setTimeout(() => {
fn(...args);
clearTimeout(timeout = false);
}, delay);
}
}
};
Комментарии:
1. что такое функция дроссельной заслонки?
2. Это безопасно в использовании, но не очень читаемо.
3. По сути, это предотвращает выполнение функции, если не прошло время задержки.
Ответ №1:
Код:
clearTimeout(timeout = false)
вычисляется как:
timeout = false;
clearTimeout(timeout)
это означает, что вы вызываете clearTimeout(false)
, и это неверно. clearTimeout()
должен вызываться с идентификатором тайм-аута, возвращаемым setTimeout()
.
Кажется, это работает, потому что вы вызываете clearTimeout()
функцию, которая выполняется по истечении времени ожидания. Вызов clearTimeout()
не работает, но время ожидания уже истекло, и JavaScript все равно его очищает.
Вызов clearTimeout()
из обратного вызова по таймауту не требуется и не помогает. Цель clearTimeout()
состоит в том, чтобы вызвать его до истечения времени ожидания, чтобы предотвратить выполнение обратного вызова, установленного с setTimeout()
помощью .
Ваш код должен быть:
timeout = setTimeout(() => {
fn(...args);
timeout = false;
}, delay);
Комментарии:
1. О, дух, не могу поверить, что я не заметил, что clearTimeout вызывается после истечения тайм-аута.. Да, вы правы, я использовал
timeout = false
вместоclearTimeout(timeout = false)
, и он все еще работает, и код немного чище.