логотип PurpleSchool
Иконка входа
Вход
  • Обучение
  • Войти
логотип PurpleSchool

Async в JavaScript

Автор

Дмитрий Нечаев

JavaScript изначально разрабатывался как синхронный язык программирования, однако с ростом его популярности и расширением сферы применения возникла потребность в асинхронном программировании. Это позволяет браузерам выполнять длительные операции, такие как загрузка данных или обработка файлов, без блокировки пользовательского интерфейса. Для понимания асинхронности в JavaScript важно ознакомиться с такими понятиями, как Event Loop (цикл событий), Web APIs, промисы и синтаксис async/await.

Синхронный код и его проблемы

Синхронный код в JavaScript исполняется последовательно, то есть каждая операция должна быть завершена, прежде чем начнётся следующая. Это может привести к проблемам, например, к "замораживанию" интерфейса при выполнении длительных операций. Примером такой задачи может служить загрузка изображения:

function loadImageSync(url) {
    const image = new Image();
    image.src = url;
    document.body.appendChild(image);
}
loadImageSync('path/to/image.jpg'); // Интерфейс не отзывчив до завершения загрузки

Асинхронный код

Асинхронный код позволяет начать операцию и продолжить выполнение следующего кода, не дожидаясь её окончания. Асинхронность достигается с помощью колбэков, промисов или синтаксиса async/await. Пример асинхронной загрузки изображения:

function loadImageAsync(url) {
    const image = new Image();
    image.onload = () => {
        document.body.appendChild(image);
        console.log('Изображение загружено');
    };
    image.src = url;
}
loadImageAsync('path/to/image.jpg'); // Интерфейс остаётся отзывчивым

Промисы (Promise)

Промисы — это объекты, которые представляют будущий результат асинхронной операции. Они имеют три состояния: ожидание, выполнено и отклонено. Промисы позволяют управлять асинхронным кодом более удобно и избегать "ада колбэков".

const loadImagePromise = (url) => {
    return new Promise((resolve, reject) => {
        const image = new Image();
        image.onload = () => {
            resolve(image);
        };
        image.onerror = () => {
            reject(new Error(`Не удалось загрузить изображение по адресу ${url}`));
        };
        image.src = url;
    });
};

loadImagePromise('path/to/image.jpg').then(image => {
    document.body.appendChild(image);
}).catch(error => {
    console.error(error);
});

Связка async/await

async и await — современный синтаксис для работы с промисами, который позволяет писать асинхронный код так, как если бы он был синхронным. Пример:

async function loadImageAsyncAwait(url) {
    try {
        let response = await fetch(url);
        let imageBlob = await response.blob();
        let image = new Image();
        image.src = URL.createObjectURL(imageBlob);
        document.body.appendChild(image);
    } catch (error) {
        console.error('Ошибка при загрузке изображения:', error);
    }
}

loadImageAsyncAwait('path/to/image.jpg');

Плюсы async/await

  • Улучшение читаемости кода.
  • Упрощение обработки ошибок с помощью try и catch.
  • Уменьшение вложенности кода по сравнению с промисами и колбэками.

Заключение

Асинхронное программирование в JavaScript значительно улучшает пользовательский опыт, позволяя выполнять длительные операции без блокировки интерфейса. Понимание механизмов асинхронности, таких как цикл событий, промисы и async/await, критически важно для разработки эффективных и отзывчивых веб-приложений.

изображение курса

Основы JavaScript

Антон Ларичев
иконка часов18 часов лекций
иконка звёздочки рейтинга4.8
Frontend
Backend
Mobile
2 999 ₽
Основы JavaScript