Skip to content

Commit 254179a

Browse files
authored
Merge pull request #715 from Andrii256/01-06-09-call-apply-decorators
Fix call apply decorators (01-06-09)
2 parents e875585 + fe5d346 commit 254179a

File tree

9 files changed

+47
-47
lines changed

9 files changed

+47
-47
lines changed

1-js/06-advanced-functions/09-call-apply-decorators/01-spy-decorator/_js.view/solution.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
function spy(func) {
2-
2+
33
function wrapper(...args) {
4-
// using ...args instead of arguments to store "real" array in wrapper.calls
4+
// використовуємо ...args замість arguments щоб можна було зберігати "справжній" масив в wrapper.calls
55
wrapper.calls.push(args);
66
return func.apply(this, args);
77
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
function spy(func) {
2-
// your code
2+
// твій код
33
}
44

55

1-js/06-advanced-functions/09-call-apply-decorators/01-spy-decorator/task.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ importance: 5
88

99
Кожен виклик зберігається як масив аргументів.
1010

11-
For instance:
11+
До прикладу:
1212

1313
```js
1414
function work(a, b) {

1-js/06-advanced-functions/09-call-apply-decorators/02-delay/solution.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ f1000("тест"); // показує "тест" після 1000 мс
1818

1919
Якщо ми передамо звичайну функцію, `setTimeout` буде викликати її без аргументів, а `this=window` (припускаючи, що ми знаходимося в браузері).
2020

21-
Ми все ще можемо передати право `this` за допомогою проміжної змінної, але це трохи більше громіздко:
21+
Ми все ще можемо передати коректний `this` за допомогою проміжної змінної, але це трохи більш громіздко:
2222

2323
```js
2424
function delay(f, ms) {

1-js/06-advanced-functions/09-call-apply-decorators/02-delay/task.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,4 @@ f1500("тест"); // показує "test" після 1500 мс
2323

2424
Іншими словами, `delay(f, ms)` повертає варіант `f` з "затримкою на `ms`".
2525

26-
У коді вище, `f` є функцією одного аргументу, але ваше рішення повинно передавати всі аргументи та контекст `this`.
26+
У коді вище, функція `f` приймає лише один аргумент, але ваше рішення повинно передавати всі аргументи та контекст `this`.

1-js/06-advanced-functions/09-call-apply-decorators/03-debounce/task.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ importance: 5
44

55
# Декоратор debounce
66

7-
Результат `debounce(f, ms)` декоратору -- це обгортка, що призупиняє виклики до `f`, поки не пройде `ms` мілісекунд бездіяльності (без викликів, "cooldown period"), а потім викликає `f` один раз з останніми аргументами.
7+
Результат декоратора `debounce(f, ms)` -- це обгортка, що призупиняє виклики до `f`, поки не пройде `ms` мілісекунд бездіяльності (без викликів, "cooldown period"), а потім викликає `f` один раз з останніми аргументами.
88

99
Іншими словами, `debounce` -- це як секретар, який приймає "телефонні дзвінки", і чекає, поки не закінчаться `ms` мілісекунди тиші. І лише тоді він передає останню інформацію про виклик до "боса" (викликає фактичну `f`).
1010

11-
Наприклад, у нас була функція `f` і замінили її на `f = debounce(f, 1000)`.
11+
Наприклад, якщо ми візьмемо функцію `f` і замінимо її на `f = debounce(f, 1000)`.
1212

1313
Тоді, якщо загорнута функція викликається при 0 мс, 200 мс та 500 мс, а потім викликів немає, то фактична `f` буде викликатися лише один раз, при 1500 мс. Тобто: після закінчення періоду 1000 мс від останнього виклику.
1414

@@ -29,9 +29,9 @@ setTimeout( () => f("c"), 500);
2929

3030
Тепер практичний приклад. Скажімо, користувач друкує щось, і ми хотіли б надіслати запит на сервер, коли ввід закінчиться.
3131

32-
Немає сенсу надсилати запит на кожен набраний символ. Замість цього ми хотіли б почекати, а потім обробляти весь результат.
32+
Немає сенсу надсилати запит після кожного введеного символу. Замість цього ми хотіли б почекати поки користувач закінчить вводити текст, а тоді уже обробляти весь результат.
3333

34-
У веббраузері ми можемо налаштувати обробник подій -- функцію, яка викликається при кожній зміні поля введення.Зазвичай, обробник подій викликається дуже часто, для кожного друкованого символу. Але якщо ми використаємо `debounce` на 1000 мс, то він буде викликатися лише один раз, через 1000 мс після останнього введення.
34+
У веббраузері ми можемо налаштувати обробник подій -- функцію, яка викликається при кожній зміні поля введення. Зазвичай, обробник подій викликається дуже часто, для кожного друкованого символу. Але якщо ми використаємо `debounce` на 1000 мс, то він буде викликатися лише один раз, через 1000 мс після останнього введення.
3535

3636
```online
3737
@@ -44,7 +44,7 @@ setTimeout( () => f("c"), 500);
4444

4545
Отже, `debounce` -- це чудовий спосіб обробки послідовності подій: будь то послідовність натискання клавіш, рухів миші або щось інше.
4646

47-
Він чекає певного часу після останнього дзвінка, а потім запускає свою функцію, яка може обробити результат.
47+
Він чекає певного часу після останнього виклику, а потім запускає свою функцію, яка може обробити результат.
4848

4949
Завдання полягає в тому, щоб реалізувати декоратор `debounce`.
5050

1-js/06-advanced-functions/09-call-apply-decorators/04-throttle/solution.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ function throttle(func, ms) {
3232
Виклик `throttle(func, ms)` повертає `wrapper`.
3333

3434
1. Під час першого виклику `wrapper` просто викликає `func` і встановлює стан відпочинку (`isThrottled = true`).
35-
2. У цьому стані всі виклики запам’ятовуються в `savedArgs/savedThis`. Зверніть увагу, що як контекст, так і аргументи однаково важливі, і повинні бути запам’ятованими. Нам потрібні вони їх одночасно, щоб відтворити виклик.
36-
3. Після того, як `ms` мілісекунди проходять, `setTimeout` спрацьовує. Стан відпочинку знімається (`isThrottled = false`) і, якщо ми мали проігноровані виклики, `wrapper` виконується з останніми запам’ятовуваними аргументами та контекстом.
35+
2. Під час цього стану всі виклики запам’ятовуються в `savedArgs/savedThis`. Зверніть увагу, що як контекст, так і аргументи однаково важливі, і повинні бути запам’ятованими. Для кожного повноцінного виклику, нам потрібні і аргумент, і контекст одночасно.
36+
3. Після того, як минає `ms` мілісекунд, `setTimeout` спрацьовує. Стан відпочинку знімається (`isThrottled = false`) і, якщо ми мали проігноровані виклики, `wrapper` виконується з останніми збереженими аргументами та контекстом.
3737

38-
3-й крок запускає не `func`, а `wrapper`, тому що ми не тільки повинні виконувати `func`, але й ще раз вводити стан відпочинку та налаштовувати тайм-аут, щоб скинути його.
38+
3-й крок запускає не `func`, а `wrapper`, тому що ми не тільки повинні виконувати `func`, але й ще раз вводити стан відпочинку та налаштовувати тайм-аут, щоб потім знову відмінити стан відпочинку.

1-js/06-advanced-functions/09-call-apply-decorators/04-throttle/task.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,23 +14,23 @@ importance: 5
1414

1515
Іншими словами, `throttle` -- це як секретар, який приймає телефонні дзвінки, але турбує боса (викликає фактичну `f`) не частіше, ніж один раз на `ms` мілісекунд.
1616

17-
Перевірмо застосунок з реального життя, щоб краще зрозуміти ці вимогу та побачити, звідки вони походять.
17+
Перевірмо застосунок з реального життя, щоб краще зрозуміти цю вимогу та побачити, звідки вона походить.
1818

1919
**Наприклад, ми хочемо відстежувати рухи миші.**
2020

2121
У браузері ми можемо налаштувати запускати функцію при кожному русі миші та отримати місце курсору та те, як він рухається. Під час активного використання миші ця функція зазвичай працює дуже часто, може бути щось на зразок 100 разів на секунду (кожні 10 мс).
2222
**Ми хотіли б оновити деяку інформацію на вебсторінці, коли курсор рухається.**
2323

24-
...Але функція оновлення `update()` занадто тяжка, щоб виконувати її це на кожному мікрорусі. Також немає сенсу в оновленні частіше, ніж один раз на 100 мс.
24+
...Але функція оновлення `update()` занадто тяжка, щоб виконувати її після кожного найменшого руху миші. Та й нам немає сенсу в оновленні частіше, ніж один раз на 100 мс.
2525

26-
Отже, ми загорнемо її в декоратор: використовуємо `throttle(update, 100)` як функцію для запуску на кожному переміщенні миші замість оригінального `update()`. Декоратор буде викликатися часто, але передавали виклик до `update()` максимум один раз на 100 мс.
26+
Отже, ми загорнемо її в декоратор: використаємо `throttle(update, 100)` як функцію для запуску після кожного руху миші замість оригінального `update()`. Сам декоратор буде викликатися часто, але передаватиме виклик до `update()` максимум один раз на 100 мс.
2727

2828
Візуально, це буде виглядати так:
2929

30-
1. Для першого руху миші декорований варіант негайно передає виклик до `update`. Це важливо, що користувач негайно побачить нашу реакцію на його рух.
30+
1. Для першого руху миші декорований варіант негайно передає виклик до `update`. Це важливо, щоб користувач негайно побачив нашу реакцію на його рух.
3131
2. Після того, як миша рухається, до `100ms` нічого не відбувається. Декорований варіант ігнорує виклики.
3232
3. Наприкінці `100ms` -- ще один `update` відбувається з останніми координатами.
33-
4. Тоді, нарешті, миша зупиняється десь. Декорований варіант чекає, доки `100ms` закінчуються, а потім запускає `update` з останніми координатами. Отже, дуже важливо, щоб остаточні координати миші обробилися.
33+
4. Тоді, нарешті, миша зупиняється десь. Декорований варіант чекає, доки мине `100ms`, а потім запускає `update` з останніми координатами. Отже, дуже важливо, щоб остаточні координати миші обробилися.
3434

3535
Приклад коду:
3636

@@ -47,7 +47,7 @@ f1000(2); // (обмеження, 1000 мс ще не закінчилися)
4747
f1000(3); // (обмеження, 1000 мс ще не закінчилися)
4848

4949
// коли 1000 ms time out ...
50-
// ...вивід 3, проміжне значення 2 було проігноровано
50+
// ...виводить 3; проміжне значення 2 було проігноровано
5151
```
5252

5353
P.S. Аргументи та контекст `this` передані в `f1000` повинні бути передані оригінальній `f`.

0 commit comments

Comments
 (0)