---------------------------------------------------- Функции-обертки (Wrappers) ------------------------------------------------ 00:00:00 Синхронная функция-обертка 00:02:55 Синхронная универсальная функция-обертка 00:08:28 Асинхронная универсальная функция-обертка 00:15:50 Синхронная функция-обертка, которая добавляет поведение (timeout) 00:22:45 Асинхронная функция-обертка, которая добавляет поведение (timeout) 00:25:38 Функция-обертка, которая ограничивает вызов функции до одного вызова (once) 00:27:36 Функция-обертка, которая ограничивает вызов функции до n-го вызова (limit) 00:29:50 Функция-обертка, которая отменяет вызов функции (cancel) 00:32:29 Функция-обертка с методами timeout, limit, cancel 00:39:03 Функция-обертка с методами timeout, limit, cancel (оптимизированная) 00:42:28 Функция-обертка, которая ограничивает один вызов за 200 мс (throttle) ----------------------------------------------------------- Примеси (Mixins) --------------------------------------------------------------- 00:45:47 Примесь поля через точку 00:51:35 Примесь поля через функцию extend 00:57:35 Примесь поля через object.assign( ) 00:59:18 Примесь поведения 01:02:23 Примесь изменения класса --------------------------------------------------- Мемоизация (Memoization) --------------------------------------------------- 01:06:50 Определение 01:07:30 Реализация простой мемоизации 01:14:43 Реализация простой мемоизации с проверкой скорости 01:20:43 Удаление накопленного кэша 01:25:35 Асинхронная мемоизация 01:31:10 Преобразование аргументов и ключей в hash-функцию 01:33:32 Реализация сложной мемоизации
Автор можно ли у Вас спросить, Вы говорите что отсутствие замыканий увеличит скорость работы алгоритма. Можно ли в таком случае избавится от замыкания заменив обращения в теле функции chache на memoized.chache? В таком случае мы будем напрямую обращаться к полю которое установили с помощью Object.assign и тогда идентификатор chache будет собран GB?
Оптимизированный wrapper. Если уже используется замыкание, то лучше не использовать this. Тем более, что из самого объявления methods, никак не следует, чем этот this будет равен. Кроме того, в том же замыкании у нас уже объявлен wrapper, лучше его и возвращать. Не использование this существенно упростит использование методов вроппера для композиции (в т.ч. и в качестве колл-бэков), т.к. они все будут явно связаны wrapper.
В оптимизированной мемоизации ошибка: чтобы действительно не использовалось замыкание, как вы об этом говорите, надо внутри memoized заменить всюду cache на this.cache
wrapper.timeout = msec => { setTimeout(wrapper.cancel, msec); return wrapper; }; Т.е. wrapper.cancel не меняется, то лишнюю лямбду при установке таймера создавать не надо.
@@АлександрФомин-л1э странно, убрал даже больше, работает как задумано: return (...args) => { if (!timer) return; // clearTimeout(timer); // timer = null; return f(...args); }; и fn200('second'); setTimeout(() => { fn200('second'); }, 150); setTimeout(() => { fn200('second'); }, 250); выводят: Function called, par: second Function called, par: second Function timed out
С обертками (декораторами функций -- очень сложный пример: wrapAsync). Декораторы функций -- шикарно идут с `pipeline`-оператором: "|>". См. пример ниже. gist.github.com/DScheglov/a397fb07cb854f94e47b3041eb69c8ac
@@andrewananenko797 тут таке питання: хто такі "ви"? ;))) Викидати не довелося. Ми мігрували на TS, де немає підтримки пайплайн оператора, і просто замінили все на pipe(..) -- от і все. Пропозиція щодо цього оператора зараз на Stage 2. Коли мій коментар писався (5 років тому), пропозиція була на Stage 1, і вона тоді включала мінімальну та F# імплементації, обидві допускали код, який наведено у гісті. І сподівання були, що воно таки скоро з'явиться ... Але ... зараз говорять, що це буде 2025-26 ... але це не точно .... Тепер щодо коментаря по суті -- він все одно справедливий, бо приклад у відео Тимура заскладний. В тім, відео ще старше за мій коментар, то ж гадаю, Тимур більше такі обгортки не робить
---------------------------------------------------- Функции-обертки (Wrappers) ------------------------------------------------
00:00:00 Синхронная функция-обертка
00:02:55 Синхронная универсальная функция-обертка
00:08:28 Асинхронная универсальная функция-обертка
00:15:50 Синхронная функция-обертка, которая добавляет поведение (timeout)
00:22:45 Асинхронная функция-обертка, которая добавляет поведение (timeout)
00:25:38 Функция-обертка, которая ограничивает вызов функции до одного вызова (once)
00:27:36 Функция-обертка, которая ограничивает вызов функции до n-го вызова (limit)
00:29:50 Функция-обертка, которая отменяет вызов функции (cancel)
00:32:29 Функция-обертка с методами timeout, limit, cancel
00:39:03 Функция-обертка с методами timeout, limit, cancel (оптимизированная)
00:42:28 Функция-обертка, которая ограничивает один вызов за 200 мс (throttle)
----------------------------------------------------------- Примеси (Mixins) ---------------------------------------------------------------
00:45:47 Примесь поля через точку
00:51:35 Примесь поля через функцию extend
00:57:35 Примесь поля через object.assign( )
00:59:18 Примесь поведения
01:02:23 Примесь изменения класса
--------------------------------------------------- Мемоизация (Memoization) ---------------------------------------------------
01:06:50 Определение
01:07:30 Реализация простой мемоизации
01:14:43 Реализация простой мемоизации с проверкой скорости
01:20:43 Удаление накопленного кэша
01:25:35 Асинхронная мемоизация
01:31:10 Преобразование аргументов и ключей в hash-функцию
01:33:32 Реализация сложной мемоизации
Спасибо, все уроки просто 🤯
Спасибо!
Автор можно ли у Вас спросить, Вы говорите что отсутствие замыканий увеличит скорость работы алгоритма. Можно ли в таком случае избавится от замыкания заменив обращения в теле функции chache на memoized.chache? В таком случае мы будем напрямую обращаться к полю которое установили с помощью Object.assign и тогда идентификатор chache будет собран GB?
55:23
const extend = (obj, mixin) => (Object.keys(mixin).filter(Object.hasOwnProperty.bind(mixin)).forEach(key => obj[key] = mixin[key]), obj);
i know it is quite randomly asking but do anybody know of a good site to stream newly released movies online?
@Dax Kameron flixportal :P
@Joe Jermaine thank you, signed up and it seems to work :D I appreciate it!
@Dax Kameron happy to help xD
Оптимизированный wrapper. Если уже используется замыкание, то лучше не использовать this. Тем более, что из самого объявления methods, никак не следует, чем этот this будет равен. Кроме того, в том же замыкании у нас уже объявлен wrapper, лучше его и возвращать.
Не использование this существенно упростит использование методов вроппера для композиции (в т.ч. и в качестве колл-бэков), т.к. они все будут явно связаны wrapper.
В оптимизированной мемоизации ошибка: чтобы действительно не использовалось замыкание, как вы об этом говорите, надо внутри memoized заменить всюду cache на this.cache
wrapper.timeout = msec => {
setTimeout(wrapper.cancel, msec);
return wrapper;
};
Т.е. wrapper.cancel не меняется, то лишнюю лямбду при установке таймера создавать не надо.
22:27 нужно внутри функции timeout в return -е убрать timer = null ?
Если ты уберешь timer = null то ты сломаешь саму функцию timeout, т.е. не будет самого смысла в обертке
@@АлександрФомин-л1э странно, убрал даже больше, работает как задумано:
return (...args) => {
if (!timer)
return;
// clearTimeout(timer);
// timer = null;
return f(...args);
};
и
fn200('second');
setTimeout(() => {
fn200('second');
}, 150);
setTimeout(() => {
fn200('second');
}, 250);
выводят:
Function called, par: second
Function called, par: second
Function timed out
там он внутри имиттирует debounce )) вопрос зачем это он делает таким способом
00:07:41
С обертками (декораторами функций -- очень сложный пример: wrapAsync).
Декораторы функций -- шикарно идут с `pipeline`-оператором: "|>".
См. пример ниже.
gist.github.com/DScheglov/a397fb07cb854f94e47b3041eb69c8ac
вы с ума сошли? пайплайн оператора нету в JS, ваш код можно выбросить
@@andrewananenko797 тут таке питання: хто такі "ви"? ;)))
Викидати не довелося. Ми мігрували на TS, де немає підтримки пайплайн оператора, і просто замінили все на pipe(..) -- от і все.
Пропозиція щодо цього оператора зараз на Stage 2.
Коли мій коментар писався (5 років тому), пропозиція була на Stage 1, і вона тоді включала мінімальну та F# імплементації, обидві допускали код, який наведено у гісті.
І сподівання були, що воно таки скоро з'явиться ...
Але ... зараз говорять, що це буде 2025-26 ... але це не точно ....
Тепер щодо коментаря по суті -- він все одно справедливий, бо приклад у відео Тимура заскладний.
В тім, відео ще старше за мій коментар, то ж гадаю, Тимур більше такі обгортки не робить