Проблема:
Легко увидеть, как вы предполагали, что ваш код будет работать. Это не сложно понять неправильно, но причина, по которой он не выполняется так, как вы ожидаете, заключается в поведении функции по умолчанию.
Функция Throttle
:
![Throttle Parameters](https://i.stack.imgur.com/9WzDU.png)
Из приведенного выше вы можете видеть, что Throttle
принимает function
и wait
время в миллисекундах в качестве своих первых двух параметров, но options
не используется в вашем текущем коде, и они являются ключом к решение вашей проблемы.
Опции:
_.throttle
имеет опции leading
и trailing
. Эти два значения по умолчанию true
.
К сожалению, названные опции, хотя и подходящие, не являются кристально понятными по назначению просто из их имен, если вы не знакомы с процессом, который происходит за занавесом.
Объяснение:
leading
относится к тем, которые вызываются в соответствующее время. Это будет:
- начальный звонок
- следующий звонок после 100мс
- следующий звонок после еще 100 мс
- и т.д.
trailing
относится к последнему вызову функции throttle
, выполненной в течение интервала. Эта функция не просто удаляется, а откладывается до тех пор, пока не будет вызвана . Думайте об этом как о слоте, который доступен для заполнения в течение интервала. Когда во время интервала выполняется вызов, этот слот заполняется / заменяется новой функцией.
Это можно проиллюстрировать:
- Первый звонок сделан
- В течение интервала
- В течение интервала
function 2
заменяет function 1
в качестве конечной функции
- При
100ms
function 2
выполняется.
Важной концепцией и, в конечном счете, сутью того, что происходит в вашем коде, является следующее:
Если обе опции true
, функция трейлинг сделана в течение , интервал будет вызываться до нового ведущего вызова к функции throttle
.
Из-за этого новый ведущий вызов становится завершающим вызовом для окончания следующего интервала.
Документация, которую я получил непосредственно с официального сайта lodash, действительно указывает на это, но вы были бы прощены за недопонимание, так как это многое понять, если вы не знакомы с их условиями:
* См. Документацию по дроссельной заслонке на Lodash
Что это значит?
В вашем примере, когда вы вызываете _.throttle
, по умолчанию будет ждать выполнения вызова функции, пока не пройдет интервал, и непрерывно переписывать функцию, ожидающую вызова в течение 100ms
интервал. Чтобы изменить это и принимать / выполнять только те звонки, которые сделаны после интервала, вы можете включить trailing
в false
.
Рабочий раствор:
function say(what) {
console.group();
console.log(what);
console.timeLog("check");
console.groupEnd();
}
const t = _.throttle(say, 100, {trailing: false});
const TO = (n, i) => setTimeout(()=>{t(n);}, i);
console.time("check");
TO(1,50);
TO(1,50);
TO(1,50);
TO(1,55);
TO(2,55);
TO(3,500);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>