Веб-версияОткрыть в Telegram

Постscheduler.yield() — разбиваем долгую JS-задачу, чтобы не блокировать интерфейс!

25 сентября 2026
C
Code Ready | Frontend
scheduler.yield() — разбиваем долгую JS-задачу, чтобы не блокировать интерфейс! Длительная синхронная работа на main thread блокирует выполнение других задач. Даже обычный цикл может превратиться в длительную задачу, если обработка элементов достаточно тяжёлая: function processItems(items) { for (const item of items) { renderItem(item); } } Классический способ разбить такую работу — планировать продолжение через setTimeout(). В современных браузерах для добровольной передачи управления планировщику есть более специализированный механизм — scheduler.yield(): async function processItems(items) { for (let i = 0; i < items.length; i++) { renderItem(items[i]); if ((i + 1) % 100 === 0) { await scheduler.yield(); } } } scheduler.yield() приостанавливает текущую async-функцию и планирует её продолжение как отдельную задачу, давая браузеру возможность выполнить другую ожидающую работу на main thread: await scheduler.yield(); // выполнение продолжится позже Это принципиально отличается от await Promise.resolve(): resolved Promise продолжает выполнение через microtask queue и не обеспечивает полноценную передачу управления event loop для выполнения следующей задачи: await Promise.resolve(); // продолжение выполняется как microtask Делать yield() после каждой итерации не стоит: каждая передача управления создаёт дополнительные накладные расходы. Размер порции работы зависит от стоимости конкретных операций, поэтому 100 или 200 итераций — лишь пример, а не универсальное значение. if ((i + 1) % CHUNK_SIZE === 0) { await yieldToMain(); } Поддержка scheduler.yield() пока не универсальна, поэтому стоит предусмотреть запасной вариант: function yieldToMain() { if (globalThis.scheduler?.yield) { return scheduler.yield(); } return new Promise(resolve => setTimeout(resolve, 0)); } 🔥 scheduler.yield() полезен для кооперативного планирования длительной работы на main thread: обработки больших наборов данных и постепенного обновления сложного UI. Для тяжёлых вычислений, интенсивно использующих процессор, Worker остаётся предпочтительным решением: yield() не переносит вычисления с main thread, а только разбивает их выполнение во времени. 📣 Code Ready | #практика
29 · 2K ·

Рядом в ленте

CCode Ready | Frontend👩‍💻 Можно ли изменить стиль поля, которое браузер заполнил автоматически? :autofill — псевдокласс, который находит поля формы, куда браузер сам подставил сохранCCode Ready | Frontend📱 Reflect API — низкоуровневые операции над объектами! Разбираем Reflect API и его основные методы для чтения, изменения, проверки и удаления свойств, вызова фу
это сообщение
CCode Ready | Frontend🤔 Неожиданно интересная статья на Хабре: «Сложнейшая проблема компьютерных наук: центрирование»! В этой статье: • Разберётесь, почему Flexbox и Grid не гарантирCCode Ready | Frontend👩‍💻 Псевдоэлемент для стилизации встроенной кнопки выбора файла внутри <input type="file">. ::file-selector-button — псевдоэлемент, представляющий кнопку внутри
CCode Ready | FrontendCode Ready | Frontend@code_ready · канал · Технологии
21 645подписчиков1 559средний охват поста
Лента площадки Открыть в Telegram

Открытая публичная лента из поискового индекса ChatCrawler — «Google по публичному Telegram»; обновляется по мере обхода площадки. Время — UTC.

Только публичный контент, официальный API Telegram. О проекте · Вопросы · Чего мы не делаем · Убрать страницу из выдачи · Каталог · Поиск · Как мы считаем