Мы постоянно используем
for..of, ...spread, Array.from(), но редко задумываемся, как работает протокол итераторов, который можно реализовать вручную для любых структур. В этом посте:
• Поймём устройство Symbol.iterator и next();
• Сделаем свои перебираемые объекты, не похожие на массивы;
• Управляем моментом остановки обхода;
• Строим линейный API для предсказуемого перебора данных.
Iterator Protocol — это способ описать объект так, чтобы движок понимал его как источник данных с управляемым обходом, а не как статичную коллекцию.Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10🔥8👍7
This media is not supported in your browser
VIEW IN TELEGRAM
Next JS/TS Snippets — расширение, которое даёт готовые сниппеты для самых распространённых конструкций: маршруты, API-роуты, компонентные страницы, layout, middleware и многое другое, причем сразу с TypeScript-поддержкой. Экономит время, уменьшает количество опечаток и делает разработку проекта куда быстрее и приятнее.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21❤8🔥7
Асинхронный console.time() для замера промисов!
Нужно быстро померить, сколько живёт
Обычный
Ставим
Закрываем замер и сразу видим время выполнения, без создания переменных и обёрток:
То же самое работает и с группой промисов, удобно сравнивать подходы прямо в REPL:
🔥
📣 JS Ready | #совет
Нужно быстро померить, сколько живёт
fetch, Promise.all или любая async-цепочка?Обычный
console.time() для этого подходит, но многие забывают, что он прекрасно работает с await:console.time('load');Ставим
await на промис, делаем интерактивный тест в консоли:await new Promise(r => setTimeout(r, 500));
Закрываем замер и сразу видим время выполнения, без создания переменных и обёрток:
console.timeEnd('load'); // ~500msТо же самое работает и с группой промисов, удобно сравнивать подходы прямо в REPL:
console.time('race');
await Promise.race([
new Promise(r => setTimeout(r, 300)),
new Promise(r => setTimeout(r, 800))
]);
console.timeEnd('race'); // ~300msconsole.time() + await — простой и нативный способ замерить async-код и сразу увидеть разницу в поведении промисов.Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤9🔥8😁1
This media is not supported in your browser
VIEW IN TELEGRAM
Репозиторий охватывает правила структуры кода, работы с функциями, объектами, модулями и многое другое, помогая писать аккуратный и понятный код. Содержит чёткие примеры как лучше и, что стоит избегать в работе. Подходит как для новичков, так и для опытных разработчиков, которые хотят закрепить или повторить материал.
Оставляю ссылочку: GitHub📱
Please open Telegram to view this post
VIEW IN TELEGRAM
❤16🔥12👍9😁1
Параллельные запросы с лимитом (concurrency limit)!
Часто нужно обработать много задач (запросы, загрузки, расчёты), но не валить всё сразу в сеть/CPU. Сделаем простой пул, который держит, например, максимум 3 задачи одновременно.
Основа пула:
Создаём воркера, который будет запущен в нескольких параллельных экземплярах:
Стартуем
Каждая задача — функция, возвращающая
Запускаем с лимитом 3. Несмотря на параллельность, порядок результатов будет совпадать с порядком задач:
Если результаты не нужны, но нужен контроль нагрузки — запускаем так же, просто не используем массив в
🔥 Контроль параллельности без библиотек: стабильный поток задач, меньше шансов упереться в
📣 JS Ready | #практика
Часто нужно обработать много задач (запросы, загрузки, расчёты), но не валить всё сразу в сеть/CPU. Сделаем простой пул, который держит, например, максимум 3 задачи одновременно.
Основа пула:
async function runWithLimit(tasks, limit = 3) {
const results = Array(tasks.length);
let i = 0;Создаём воркера, который будет запущен в нескольких параллельных экземплярах:
const worker = async () => {
while (i < tasks.length) {
const idx = i++;
try {
results[idx] = await tasks[idx]();
} catch (e) {
results[idx] = { error: e.message };
}
}
};Стартуем
limit воркеров параллельно и ждём их завершения. После этого возвращаем массив результатов в исходном порядке: await Promise.all(Array.from({ length: limit }, () => worker()));
return results;
}Каждая задача — функция, возвращающая
Promise:const tasks = Array.from({ length: 10 }, (_, i) => async () =>
fetch(`https://jsonplaceholder.typicode.com/todos/${i + 1}`).then(r => r.json())
);Запускаем с лимитом 3. Несмотря на параллельность, порядок результатов будет совпадать с порядком задач:
runWithLimit(tasks, 3).then(data => {
console.log("Готово:", data.length);
console.log("Первый элемент:", data[0]);
});Если результаты не нужны, но нужен контроль нагрузки — запускаем так же, просто не используем массив в
.then:runWithLimit(tasks, 5).then(() => console.log("Пачка выполнена"));rate-limit и предсказуемое потребление ресурсов.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12❤8👍7🤝2
Proxy как отладочный “защитный экран” для объектов!
Иногда хочется увидеть каждое обращение к объекту, но писать вручную лог на каждый
Оборачиваем объект в
Теперь любое чтение или запись покажется в консоли интерактивно:
Можно быстро сделать защиту от несуществующих полей (экономит время при отладке чужого кода):
🔥
📣 JS Ready | #совет
Иногда хочется увидеть каждое обращение к объекту, но писать вручную лог на каждый
.prop долго и не всегда удобно.const user = { name: 'Sam', age: 28 };Оборачиваем объект в
Proxy и ловим любые GET/SET автоматически:const user = watch({ name: 'Sam', age: 28 });Теперь любое чтение или запись покажется в консоли интерактивно:
user.age; // GET - age
user.age = 30; // SET - age 30
Можно быстро сделать защиту от несуществующих полей (экономит время при отладке чужого кода):
const safe = obj => new Proxy(obj, {
get: (t,p) => p in t ? t[p] : (console.warn('No key:',p), undefined)
});
safe({ a: 1 }).b;Proxy даёт способ следить за объектом и ловить доступ к полям без переписывания исходного кода. Удобно, когда отлаживаешь динамику или работаешь с чужими структурами.Please open Telegram to view this post
VIEW IN TELEGRAM
❤10👍10🔥8
This media is not supported in your browser
VIEW IN TELEGRAM
Этот репозиторий отличная шпаргалка для тех, кто готовится к собесам или хочет укрепить знания. В нём собраны ключевые вопросы по синтаксису, типам данных, областям видимости, замыканиям, промисам, async/await и др. важным темам, которые часто встречаются. Можно бегло пройтись по вопросам, чтобы вспомнить слабые места.
Оставляю ссылочку: GitHub📱
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17❤9👍8🤝1
Отменяем fetch по таймауту!
Иногда
Контроллер создаёт сигнал отмены, который понимает
Задаём обычный таймаут, чтобы сделать отмену, если ответ не пришёл вовремя:
Через секунду запрос прервётся.
Передаём сигнал прямо в
Если запрос отменится, промис упадёт с
Проверяем интерактивно в консоли, как это выглядит при обрыве:
🔥
📣 JS Ready | #совет
Иногда
fetch должен сам отмениться, если сервер думает слишком долго, без логики таймаута и Promise-обёрток.const c = new AbortController();
Контроллер создаёт сигнал отмены, который понимает
fetch.Задаём обычный таймаут, чтобы сделать отмену, если ответ не пришёл вовремя:
setTimeout(() => c.abort(), 1000);
Через секунду запрос прервётся.
Передаём сигнал прямо в
fetch и он станет отменяемым нативно:await fetch(url, { signal: c.signal });Если запрос отменится, промис упадёт с
AbortError.Проверяем интерактивно в консоли, как это выглядит при обрыве:
try {
const c = new AbortController();
setTimeout(() => c.abort(), 500);
await fetch('https://httpbin.org/delay/2', { signal: c.signal });
} catch (e) {
console.log(e.name); // AbortError
}AbortController + signal дают нативный способ отменять fetch по таймауту, без лишнего кода.Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤7🔥7🤝4
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18👍10🤝6❤3
Сегодня делаем консольную игру, в которой реализована базовая логика сапёра. Присутствует полноценный игровой цикл и управление состоянием.
В этой задаче:
• Генерируем поле со случайными минами;
• Обрабатываем пользовательский ввод;
• Считаем соседние мины;
• Обновляем состояние игры и рендер;
Задача отлично показывает, как из минимального набора условий и структур данных собирается интерактивная логика.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17❤9👍8
Например, useState помогает хранить состояние компонента, а useEffect — работать с побочными эффектами и запросами к API.
На картинке — основные темы и приёмы, которые чаще всего используются в React-разработке: хуки, рендеринг, формы, роутинг, стилизация и оптимизация.
Сохрани, чтобы не забыть!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15❤7🔥7
Форматируем JSON прямо в коде, без внешних инструментов!
Отступ можно задать и табами, если такой формат удобнее читать при логировании:
Второй параметр —
Пример с табуляцией для читаемого вывода в консоль:
Корректный вывод будет таким (значения — строки в кавычках, как и требует формат JSON):
🔥
📣 JS Ready | #совет
JSON.stringify умеет не только сериализовать, но и форматировать вывод — достаточно передать отступы третьим параметром:JSON.stringify(obj, null, 2);
Отступ можно задать и табами, если такой формат удобнее читать при логировании:
JSON.stringify(obj, null, '\t');
Второй параметр —
replacer, позволяет явно перечислить поля, которые попадут в вывод, что удобно для отладки больших объектов:JSON.stringify(obj, ['a', 'b'], 2);
Пример с табуляцией для читаемого вывода в консоль:
console.log(JSON.stringify({ alpha: 'A', beta: 'B' }, null, '\t'));Корректный вывод будет таким (значения — строки в кавычках, как и требует формат JSON):
{
"alpha": "A",
"beta": "B"
}JSON.stringify — быстрый способ получить читаемый и точный JSON-вывод прямо в консоли, с контролем полей и отступов.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15❤9👍6🤝2
This media is not supported in your browser
VIEW IN TELEGRAM
Это целый сборник небольших онлайн-утилит, которые помогают в повседневной работе. Здесь можно генерировать и копировать CSS-градиенты, тени, clip-path, SVG-паттерны и другие визуальные штуки, сразу с готовым кодом. Удобный сайт, когда нужно быстро поэкспериментировать с визуалом или просто не писать всё с нуля.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14❤9👍6😁1🤝1
Практика отладки: читаемые логи в DevTools!
При выводе массивов объектов в консоль стандартный
Данные отображаются в виде таблицы. В большинстве современных DevTools доступна сортировка по колонкам и удобный просмотр значений, что упрощает анализ массивов и API-ответов.
Для акцентирования внимания на важных событиях можно использовать стилизацию через спецификатор
Приём полезен для временной отладки и маркировки критических участков выполнения.
Чтобы структурировать поток сообщений в консоли, используйте группировку:
Группы упрощают навигацию по логам при анализе сложных сценариев и асинхронных процессов.
🔥 Структурированные логи ускоряют отладку, снижают когнитивную нагрузку и делают консоль понятной не только автору кода.
📣 JS Ready | #практика
При выводе массивов объектов в консоль стандартный
console.log быстро теряет читаемость. Для структурированного представления данных стоит использовать console.table():const bugs = [
{ id: 1, title: "CSS не грузится", status: "open" },
{ id: 2, title: "API 500", status: "fixed" },
{ id: 3, title: "Кнопка не реагирует", status: "open" }
];
console.table(bugs);
Данные отображаются в виде таблицы. В большинстве современных DevTools доступна сортировка по колонкам и удобный просмотр значений, что упрощает анализ массивов и API-ответов.
Для акцентирования внимания на важных событиях можно использовать стилизацию через спецификатор
%c:console.log(
"%cCRITICAL BUG DETECTED",
"font-size: 18px; font-weight: bold; color: red;"
);
Приём полезен для временной отладки и маркировки критических участков выполнения.
Чтобы структурировать поток сообщений в консоли, используйте группировку:
console.group("User Load Flow");
console.log("Запрос данных пользователя");
console.log("Запрос ролей");
console.groupEnd();Группы упрощают навигацию по логам при анализе сложных сценариев и асинхронных процессов.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11👍8❤7