|
1 | | -importance: 5 |
| 1 | +важность: 5 |
2 | 2 |
|
3 | 3 | --- |
4 | 4 |
|
5 | | -# Throttle decorator |
| 5 | +# Задерживающий декоратор |
6 | 6 |
|
7 | | -Create a "throttling" decorator `throttle(f, ms)` -- that returns a wrapper, passing the call to `f` at maximum once per `ms` milliseconds. Those calls that fall into the "cooldown" period, are ignored. |
| 7 | +Создайте "задерживающий" декоратор `throttle(f, ms)` - который возвращает обёртку, передавая вызов в `f` не более одного раза в `ms` миллисекунд. Те вызовы, которые попадают в период "задержки", игнорируются. |
8 | 8 |
|
9 | | -**The difference with `debounce` -- if an ignored call is the last during the cooldown, then it executes at the end of the delay.** |
| 9 | +**Вариант с `debounce` - если проигнорированный вызов является последним во время "задержки", то он выполняется в конце.** |
10 | 10 |
|
11 | | -Let's check the real-life application to better understand that requirement and to see where it comes from. |
| 11 | +Давайте рассмотрим реальное приложение, чтобы лучше понять это требование и выяснить, откуда оно взято. |
12 | 12 |
|
13 | | -**For instance, we want to track mouse movements.** |
| 13 | +**Например, мы хотим отслеживать движения указателя.** |
14 | 14 |
|
15 | | -In browser we can setup a function to run at every mouse micro-movement and get the pointer location as it moves. During an active mouse usage, this function usually runs very frequently, can be something like 100 times per second (every 10 ms). |
| 15 | +В браузере мы можем объявить функцию, которая будет запускаться при каждом микродвижении указателя и получать его местоположение при каждом его перемещении. Во время активного использования мыши эта функция запускается очень часто, это может происходить около 100 раз в секунду (каждые 10 мс). |
16 | 16 |
|
17 | | -**The tracking function should update some information on the web-page.** |
| 17 | +**Отслеживающая функция должна обновлять некоторую информацию на веб-странице.** |
18 | 18 |
|
19 | | -Updating function `update()` is too heavy to do it on every micro-movement. There is also no sense in making it more often than once per 100ms. |
| 19 | +Функция обновления `update()` слишком ресурсоёмкая, чтобы делать это при каждом микродвижении. Также нет смысла делать это чаще, чем один раз в 100 мс. |
20 | 20 |
|
21 | | -So we'll assign `throttle(update, 100)` as the function to run on each mouse move instead of the original `update()`. The decorator will be called often, but `update()` will be called at maximum once per 100ms. |
| 21 | +Поэтому мы объявим `throttle(update, 100)` как функцию, которая будет запускаться при каждом перемещении указателя вместо оригинальной `update()`. Декоратор будет вызываться часто, но `update()` будет вызываться максимум раз в 100 мс. |
22 | 22 |
|
23 | | -Visually, it will look like this: |
| 23 | +Визуально это будет выглядеть вот так: |
24 | 24 |
|
25 | | -1. For the first mouse movement the decorated variant passes the call to `update`. That's important, the user sees our reaction to their move immediately. |
26 | | -2. Then as the mouse moves on, until `100ms` nothing happens. The decorated variant ignores calls. |
27 | | -3. At the end of `100ms` -- one more `update` happens with the last coordinates. |
28 | | -4. Then, finally, the mouse stops somewhere. The decorated variant waits until `100ms` expire and then runs `update` with last coordinates. So, perhaps the most important, the final mouse coordinates are processed. |
| 25 | +1. Для первого движения указателя декорированный вариант передает вызов в `update`. Это важно, т.к. пользователь сразу видит нашу реакцию на его перемещение. |
| 26 | +2. Затем, когда указатель продолжает движение, в течение 100 мс ничего не происходит. Декорированный вариант игнорирует вызовы. |
| 27 | +3. По истечению 100 мс происходит еще одно «обновление» с последними координатами. |
| 28 | +4. Затем, наконец, указатель где-то останавливается. Декорированный вариант ждет, пока не истечет 100 мс и затем вызывает `update` с последними координатами. Так что, пожалуй, самое главное то, что окончательные координаты указателя обработаны. |
29 | 29 |
|
30 | | -A code example: |
| 30 | +Пример кода: |
31 | 31 |
|
32 | 32 | ```js |
33 | 33 | function f(a) { |
34 | 34 | console.log(a) |
35 | | -}; |
| 35 | +} |
36 | 36 |
|
37 | | -// f1000 passes calls to f at maximum once per 1000 ms |
| 37 | +// f1000 передает вызовы f максимум раз в 1000 мс |
38 | 38 | let f1000 = throttle(f, 1000); |
39 | 39 |
|
40 | | -f1000(1); // shows 1 |
41 | | -f1000(2); // (throttling, 1000ms not out yet) |
42 | | -f1000(3); // (throttling, 1000ms not out yet) |
| 40 | +f1000(1); // показывает 1 |
| 41 | +f1000(2); // (ограничение, 1000 мс еще нет) |
| 42 | +f1000(3); // (ограничение, 1000 мс еще нет) |
43 | 43 |
|
44 | | -// when 1000 ms time out... |
45 | | -// ...outputs 3, intermediate value 2 was ignored |
| 44 | +// когда 1000 мс истекли ... |
| 45 | +// ...выводим 3, промежуточное значение 2 было проигнорировано |
46 | 46 | ``` |
47 | 47 |
|
48 | | -P.S. Arguments and the context `this` passed to `f1000` should be passed to the original `f`. |
| 48 | +P.S.: Аргументы и контекст `this`, переданные в `f1000`, должны быть переданы в оригинальную `f`. |
0 commit comments