HowProgrammingWorks - JavaScript and Node.js Programming
6.31K subscribers
311 photos
7 videos
1 file
762 links
Программная инжененрия для JavaScript, TypeScrip, Node.js 👉 Group: https://t.me/MetarhiaHPW 👉 Node.js channel: https://t.me/metarhia 👉 Node.js group: https://t.me/nodeua
Download Telegram
💡 Начиная Chrome 119 и Node.js 22 у нас есть Promise.withResolvers();
Для чего оно нужно? Представьте, что у нас есть какое-то callback-returning API или EventEmitter/EventTarget или другие абстракции, поведения которых нужно подождать. И вот нужно сделать адаптер, обертку с внешним Promise-returning интерфейсом.

Пример:
const sumAsync = (a, b, callback) => {
if (typeof a !== 'number') return;
if (typeof b !== 'number') return;
setImmediate(() => {
callback(a + b);
});
};


Раньше это могло выглядеть так:
let resolve, reject;
const promise = new Promise((resolved, rejected) => {
resolve = resolved;
reject = rejected;
});
setTimeout(reject, 1000, new Error('Timed out'));
sumAsync(2, 3, resolve);
const result = await promise;
console.log({ result });


Или так:
const promise = new Promise((resolve, reject) => {
sumAsync(4, 5, resolve);
setTimeout(reject, 1000, new Error('Timed out'));
});
const result = await promise;
console.log({ result });


Но теперь withResolvers позволяют это написать проще
const { promise, resolve, reject } = Promise.withResolvers();
setTimeout(reject, 1000, new Error('Timed out'));
sumAsync(6, 7, resolve);
const result = await promise;
console.log({ result });


‣ Значит ли это, что иначе писать уже плохо?
Это достаточно редкая и специфическая штука, ее нужно использовать в библиотеках и коде платформ с надеждой на то, что движки будут это как-то дополнительно оптимизировать, а в продуктовом коде нет на вас вины, если пишете по старинке.

‣ Значит ли это, что оно всем нужно?
Нет, но если знаете, это плюс.
July 21, 2024
🧩 Пока я готовлю курс по паттернам GoF, SOLID, GRASP с адаптацией для Node.js и JavaScript, собрал тут ссылки на все старые материалы, видео, примеры кода, задачи, если по ссылке github репозиторий, то часто там и примеры и видео: https://github.com/tshemsedinov/Patterns-JavaScript
July 22, 2024
Программирование, как и любая человеческая деятельность насквозь мифологично, более того, мы решительно ни о чем не можем поговорить, чтобы не опереться на тот или иной миф, то у нас Node.js однопоточный (хоть никогда не был), то мы говорим о нетипизированном языке программирования (хоть таких не бывает), то переменные иммутабельные (хоть это оксюморон), то микросервисы ускоряют ответ (хоть могут только замедлять), и даже, если мы понимаем неточность терминов, и пытаемся говорить точнее, то рассказ растягивается на бесконечность, потому, что все нужно уточнять, а уточнения тоже уточнять, и к каждому факту в уточнениях можно придраться и оспорить. Так что, быстро общаться можно, но только понимая друг друга между строк. Выйти за рамки мифа можно, но только создавая новый миф. Ошибки исправить можно, но только делая новые и новые ошибки. Да и учиться сразу правильно не выйдет, мы осваиваем частично ложные знания еще и плохо осваиваем, сталкиваемся с опытом и благодаря ошибкам, можем делать следующий шаг.
July 25, 2024
August 2, 2024
Почему нужно избегать union-тайпов?

1. Каждый раз, когда юнион куда-то приходит аргументом, нужно делать if, чтобы понимать, как с ним работать, кроме случая, когда все классы/типы, входящие в юнион имплементируют один и тот же интерфейс и нас интересует обращение именно через этот интерфейс, зачем тогда юнион, используйте этот интерфейс вместо него, ну если в юнион не входит undefined, null, unknown и т.д.

2. Юнионы приводят к мегаморфной форме обращения к объектам в V8, и это замедляет код, не сметртельно, но это неприятно и проще всего всего забыть их. Но для чего же они тогда вообще нужны? Для совместимости с JS, если в нем можно передать что-угодно аргуметом, то это нужно меть возможность как-то выразить. Это не значит, что это хорошо и так нужно писать кода, это добавили как возможность, а не как обязанность )

3. Это часто ведет к нарушению SOLID:SRP (принципа единственной ответственности), потому, что как может метод, например, получать сокеты или таймеры на выбор и делать разные вещи в зависимости от этого, это же маразм, нарушает SOLID:LSP (принцип подстановки), иногда нарушает GRASP:InformationExpert, явно повышает Coupling.

Вместо этого нужно всегда использовать маленькие интерфейсы, заточенные под узкую задачу, помним про SOLID:ISP (принцип разделения интерфейсов) и могут быть optional аргументы, для этого не нужно делать union с null.
August 5, 2024
🙊 The Law of Demeter (LoD): Don’t talk to strangers

If you see something like this:
👉 connection.parent.service.storage.db.saveRecord
👉 this.action.scenario.bot.telegram.sendMessage
👉 service.find('logger').kind('error').stream.write

You have technical debt! It's time to plan refactoring.
Each entity (unit/instance) should have only limited knowledge about others (only "closely" related to the current one).
Each entity should only talk to its friends (immediate friends): don’t talk to strangers!

Вut don't do it in a panic and do not mix refactoring with other issues (like new features implementation).
Just note that and plan resource allocation.
August 6, 2024
План стримов по паттернам:
08 августа - четверг - ITBeard
09 августа - пятница - Деми Мурыч
10 августа - суббота - Илья Климов
August 7, 2024
🧩 Мастер-класс Middle to Senior in 2024
Переосмысление GRASP, SOLID и GoF паттернов для фронтенда и бекенда

Начало: 17 августа в 15:00
👉 Сюда: https://t.me/JavaScriptPatternsBot?start=TIMUR
August 13, 2024
В субботу будет мастер-класс «Middle to Senior in 2024» в 15.00 (GMT+3) 👉 https://t.me/JavaScriptPatternsBot?start=TIMUR
August 14, 2024
Я редко делаю стримы, ну вот как завтра будет. Можем найти несколько, и я считаю, вот этот до сих пор достаточно актуальный и глубокий https://youtu.be/qipIRQptP_4
August 16, 2024
Кто еще не смотрел стрим про связь профессионального роста и паттернов, то готовьтесь, там больше 7 часов, и главное — все по делу, про то, как и чему учиться и про важность культуры, которая проникает через паттерны https://www.youtube.com/watch?v=QzxklJW4_LM
August 19, 2024
Кстати, открыта предварительная регистрация на курс Patterns 2024 — я уже изучил всю доступную литературу и конкурентов и теперь уверен — аналогов нет, ни кто так и не смог сделать приличной адаптации паттернов к JavaScript, TypeScript, Async, Node.js миру — https://nodeua.com/Patterns-2024-buy.html
August 19, 2024