Проверяет понимание асинхронного выполнения тяжёлых операций в JavaScript для предотвращения блокировки пользовательского интерфейса.
JavaScript в браузере выполняется в одном главном потоке, который также отвечает за обработку событий и отрисовку страницы. Если в этом потоке выполняется тяжёлая синхронная операция, например, сложный цикл или обработка большого массива, браузер не может обновлять интерфейс, пока операция не завершится. Это приводит к зависанию страницы и плохому пользовательскому опыту.
Для операций, связанных с вводом-выводом (сетевые запросы, чтение файлов, таймеры), JavaScript использует асинхронные колбэки и промисы. Эти операции выполняются вне главного потока (например, в браузерном API или Node.js), а когда результат готов, колбэк попадает в очередь задач и обрабатывается event loop. Таким образом, главный поток остаётся свободным и может реагировать на действия пользователя.
// Пример асинхронной операции с промисом
function fetchData() {
return new Promise((resolve) => {
setTimeout(() => resolve('данные'), 1000);
});
}
async function main() {
const data = await fetchData();
console.log(data); // интерфейс не блокируется
}
main();Если операция требует много вычислений (например, обработка изображений, шифрование, сложные алгоритмы), промисы не помогут, потому что вычисления всё равно выполняются в главном потоке. В этом случае нужно использовать Web Workers — отдельные потоки, которые могут выполнять код параллельно. Главный поток общается с воркером через сообщения, не блокируя интерфейс.
// worker.js
self.onmessage = function(e) {
let result = 0;
for (let i = 0; i < e.data; i++) {
result += i;
}
self.postMessage(result);
};
// main.js
const worker = new Worker('worker.js');
worker.postMessage(1000000000);
worker.onmessage = function(e) {
console.log('Результат:', e.data);
};Для сетевых запросов, таймеров и других операций ввода-вывода используйте async/await или промисы. Для тяжёлых вычислений, которые занимают более 50 миллисекунд, применяйте Web Workers. Также можно разбивать большие задачи на части и выполнять их через setTimeout, чтобы дать браузеру возможность отрисовать кадры между кусками.
Итог: Асинхронное программирование — ключ к отзывчивому интерфейсу. Для I/O используйте промисы и async/await, для CPU-интенсивных задач — Web Workers. Это позволяет сохранить плавность работы приложения и улучшить пользовательский опыт.
Уровень
Рейтинг:
5
Сложность:
4
Навыки
JavaScript
Node.js
Ключевые слова
Подпишись на React Developer в телеграм
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию