Я хочу использовать JS Throttle. Но я изо всех сил пытаюсь заставить его работать правильно.
Я попробовал код из этой статьи: https://codeburst.io/throttling-and-debouncing-in-javascript-b01cad5c8edf
Но дроссельная заслонка не работает должным образом, поскольку каждый раз, когда я нажимаю на кнопку, появляется один "|" добавляется в div. Никакие клики не отбрасывались.
где ошибка?
function foo() {
$("#respond").append("|");
}
const throttle = (func, limit) => {
let inThrottle
return function() {
const args = arguments
const context = this
if (!inThrottle) {
func.apply(context, args)
inThrottle = true
setTimeout(() => inThrottle = false, limit)
}
}
}
var onClick = function() {
throttle(foo(), 50000);
};
$('#button').click(onClick);<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type = "button" id = "button" value = "Click Me" />
<div id = "respond"></div>Кажется, вы также возвращаете функцию из throttle, но никогда ее не выполняете. Глядя на код, кажется, что вы действительно хотите выполнить $('#button').click(throttle(foo, 50000));, поэтому вы делаете возвращаемую функцию обработчиком.
Ах, спасибо! Но почему это: $('#button').click(throttle(foo, 50000)); работает, а "var onClick = function() { throttle(foo, 50000); }; $('#button').click(onClick);" нет?
Потому что throttle(foo, 50000) по-прежнему возвращает ссылку на функцию, которую нужно выполнить позже. По сути, происходит то, что ваш обработчик выполняет var functionReference = throttle(foo, 50000), а затем ничего не делает, вместо вызова functionReference(). Имея функцию, которая просто вызывает другую функцию без аргументов (помните, что функция, которую вы получаете, не принимает никаких аргументов, так что вы как бы получаете немного запаха кода, giveCallback(() => otherFunc()) проще выразить как giveCallback(otherFunc), поэтому я предложил напрямую передать это functionReference как обработчик.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Для работы throttle(func, limit) может быть только один экземпляр его продукта.
Проблема в том, что функция onClick в вашем примере создает новый экземпляр при каждом вызове.
Это делает базовую переменную inThrottle бессмысленной, поскольку для каждого щелчка создается новая копия.
Решение состоит в том, чтобы напрямую назвать один экземпляр продуктом throttle(foo, 50000).
Также следует передать сам foo (а не его продукт).
См. Ниже практический пример, а также закрытие и сфера для получения дополнительной информации.
// Foo.
const foo = (...args) => {
$("#respond").append("|");
}
// Throttle.
const throttle = (func, limit) => {
let inThrottle
return (...args) => {
if (!inThrottle) {
func(...args)
inThrottle = setTimeout(() => inThrottle = false, limit)
}
}
}
// On Click.
const onClick = throttle(foo, 1000)
// Button - Click.
$('#button').click(onClick);<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type = "button" id = "button" value = "Click Me" />
<div id = "respond"></div>Ваш onClick создает новую регулируемую функцию при каждом вызове. Вы должны убедиться, что дросселируются только один раз
var onClick = function() {
throttle(foo(), 50000);
};
// TO
var onClick = throttle(foo, 50000);
Я знаю, что вопрос старый.
Сделал небольшой фрагмент. Я думаю, что это должно квалифицироваться как простой способ ограничения функции. Это будет гарантировать вызов каждые миллисекунды ожидания.
function throttle( fn, wait ){
let lastCall = 0;
return function(){
if ( Date.now() - lastCall > wait ){
lastCall = Date.now()
fn()
}
}
}
var counter = 0
var count = () => document.querySelector("#count").textContent = ++counter
window.addEventListener('scroll', throttle( count, 1000 ) )body{
height: 2000px;
}<h1 id='count'>
0
</h1>
foo()->foo, в противном случае вы выполняете функцию немедленно вместо того, чтобы указывать ссылку на функцию для выполнения позже.