DevNotes Live
6 subscribers
84.2K photos
12K videos
195 files
35.4K links
Автоматический агрегатор IT ресурсов в Telegram (@devnotes_robot)
Информация: https://t.me/devnotes_live/121
Download Telegram
Forwarded from Shock Design
Forwarded from Shock Design
Forwarded from Shock Design
Forwarded from Shock Design
Forwarded from Shock Design
Forwarded from Shock Design
Airbus - Configurator dashboard
Forwarded from Daily Coding 🔥
🛠 Django Cachalot - кэширует запросы Django ORM и автоматически аннулирует их.

🌍 Сайт

Daily Coding #инструменты #Python & Max
This media is not supported in your browser
VIEW IN TELEGRAM
Плaгин a55scraper — мгновенно загружает брендовые активы с указанного URL и создает стили в файле Figma.

Просто введите ссылку на сайт, и плагин автоматически импортирует все используемые элементы дизайна.

#брендинг #импорт #автоматизация
Forwarded from ai.dot(ufna, dev)
Ах да, основной домен vk (и кстати, кучи сервисов Яндекса) был на com.

Опять же, до сегодня.
Неявное зависание Promise.all при отмене AsyncIterator через AbortController

Вы используете for await...of с асинхронным генератором и AbortController для отмены. Кажется, всё чисто, но Promise.all зависает намертво. Проблема в том, что вызов abort() вызывает return() генератора, но если внутри остался незавершённый промис (таймер, подписка, поток), он просто висит, и Promise.all никогда не завершится.

Как возникает утечка
Когда abort() срабатывает внутри for await...of, итератор завершается. Но если в генераторе есть запущенный, но не завершённый setInterval, await на потоке данных или подписка на событие, этот промис остаётся висеть в памяти. Например, генератор каждую секунду отправляет данные, а при abort обработчик завершает итерацию, но не очищает таймер. Promise.all ждёт этот таймер вечно.

Диагностика на практике
Добавьте в конец return() генератора console.log('return called'). Если return вызывается, а Promise.all не завершается — ищите, какой ресурс утекает. Используйте обёртку с таймаутом: Promise.race([Promise.all(...), AbortSignal.timeout(5000)]). В продакшне это спасёт от вечного ожидания, но не решит корень проблемы.

Совет по исправлению
Всегда оборачивайте тело асинхронного генератора в try/finally. В finally явно очищайте все ресурсы: удаляйте слушатели, отменяйте таймеры, разрешайте ожидающие промисы. Например, если внутри генератора есть setInterval:
async function* gen(signal) {
const timer = setInterval(() => {}, 1000);
try {
while (!signal.aborted) {
await new Promise(r => setTimeout(r, 100));
yield data;
}
} finally {
clearInterval(timer);
}
}


Вывод: Каждый yield и await в асинхронном генераторе должен быть гарантированно завершён до конца итерации, иначе return() не прервёт внутренние промисы, что приведёт к невосстанавливаемому зависанию.
Forwarded from Shock Design
ДИгадка №38

Дизайнер и изменения логотипа: Коля в процессе работы над баннером столкнулся с проблемой увеличения логотипа. Что же произошло с формой логотипа — прочитайте в статье

Читать на дизайнерс | #урок