«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Асинхронное программирование в JavaScript: обратные вызовы, обещания и асинхронность/ожидание

Асинхронное программирование в JavaScript: обратные вызовы, обещания и асинхронность/ожидание

Опубликовано 31 июля 2024 г.
Просматривать:475

Asynchronous Programming in JavaScript: Callbacks vs Promises vs Async/Await

Асинхронное программирование — это ключевой аспект JavaScript, который позволяет разработчикам выполнять длинные сетевые запросы, операции с файлами и другие трудоемкие задачи, не блокируя основной поток. Это гарантирует, что приложения останутся отзывчивыми и удобными для пользователя. JavaScript предоставляет три основных способа обработки асинхронных операций: обратные вызовы, обещания и Async/Await. В этой статье мы углубимся в каждый из этих методов, изучая их синтаксис, использование и различия на подробных примерах.

Оглавление

  1. Введение в асинхронное программирование
  2. Обратные вызовы
    • Синтаксис и примеры
    • Преимущества и недостатки
  3. Обещания
    • Синтаксис и примеры
    • Объединение обещаний
    • Преимущества и недостатки
  4. Асинхронный/ожидающий
    • Синтаксис и примеры
    • Обработка ошибок
    • Преимущества и недостатки
  5. Сравнение и лучшие практики
  6. Заключение

Введение в асинхронное программирование

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

Обратные вызовы

Синтаксис и пример

Обратные вызовы — один из первых методов обработки асинхронных операций в JavaScript. Обратный вызов — это просто функция, передаваемая в качестве аргумента другой функции, которая будет выполнена после завершения асинхронной операции.

function fetchData(callback) {
    setTimeout(() => {
        callback("Data fetched!");
    }, 1000);
}

function displayData(data) {
    console.log(data);
}

fetchData(displayData);

В приведенном выше примере fetchData имитирует асинхронную операцию с использованием setTimeout. Через 1 секунду он вызывает функцию displayData, передавая полученные данные в качестве аргумента.

Преимущества и недостатки

Преимущества:

  • Просто и понятно для небольших задач.
  • Обеспечивает способ выполнения кода после завершения асинхронной операции.

Недостатки:

  • Может привести к «аду обратных вызовов», когда несколько асинхронных операций вложены, что затрудняет чтение и поддержку кода.
  • Обработка ошибок сложна, поскольку ошибки необходимо обрабатывать в каждом обратном вызове.

Обещания

Синтаксис и пример

Обещания были введены в ES6 (ECMAScript 2015) для решения проблем, связанных с обратными вызовами. Обещание представляет собой операцию, которая еще не завершена, но ожидается в будущем. Оно может находиться в одном из трех состояний: в ожидании, выполнено или отклонено.

function fetchData() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("Data fetched!");
        }, 1000);
    });
}

fetchData()
    .then(data => {
        console.log(data);
    })
    .catch(error => {
        console.error("Error:", error);
    });

В этом примере fetchData возвращает обещание, которое разрешается как «Данные извлечены!» через 1 секунду. Метод then используется для обработки разрешенного значения, а метод catch используется для обработки любых ошибок.

Объединение обещаний

Обещания можно объединить в цепочку для последовательного выполнения ряда асинхронных операций.

function fetchData() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("Data fetched!");
        }, 1000);
    });
}

function processData(data) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(`${data} Processed!`);
        }, 1000);
    });
}

fetchData()
    .then(data => {
        console.log(data);
        return processData(data);
    })
    .then(processedData => {
        console.log(processedData);
    })
    .catch(error => {
        console.error("Error:", error);
    });

В этом примере процессData вызывается после fetchData, и результаты обрабатываются последовательно с использованием then.

Преимущества и недостатки

Преимущества:

  • Избегает ада обратных вызовов, позволяя создавать цепочки асинхронных операций.
  • Обеспечивает встроенную обработку ошибок с помощью catch.
  • Улучшает читаемость и удобство обслуживания кода.

Недостатки:

  • Все равно может стать сложным из-за нескольких вложенных вызовов then.
  • Обработка ошибок в цепочке может быть нетривиальной.

Асинхронный/ожидающий

Синтаксис и пример

Async/Await, представленный в ES2017, обеспечивает более читабельный и лаконичный способ написания асинхронного кода с использованием Promises. Ключевое слово async используется для определения асинхронной функции, а ключевое слово await используется для приостановки выполнения до тех пор, пока не будет выполнено обещание.

async function fetchData() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("Data fetched!");
        }, 1000);
    });
}

async function displayData() {
    const data = await fetchData();
    console.log(data);
}

displayData();

В этом примере displayData — это асинхронная функция, которая ожидает завершения fetchData перед записью данных.

Обработка ошибок

Обработку ошибок с помощью Async/Await можно выполнить с помощью блоков try/catch.

async function fetchData() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            reject("Failed to fetch data!");
        }, 1000);
    });
}

async function displayData() {
    try {
        const data = await fetchData();
        console.log(data);
    } catch (error) {
        console.error("Error:", error);
    }
}

displayData();

Здесь, если fetchData завершается неудачно, ошибка перехватывается и регистрируется блоком catch.

Преимущества и недостатки

Преимущества:

  • Упрощает асинхронный код, делая его более похожим на синхронный.
  • Повышает читаемость и удобство сопровождения кода.
  • Упрощает обработку ошибок с помощью блоков try/catch.

Недостатки:

  • Требуется понимание Promises, поскольку Async/Await построен на их основе.
  • Все еще относительно новый, поэтому некоторые среды могут не полностью его поддерживать.

Сравнение и лучшие практики

Сравнение

  • Обратные вызовы: подходят для простых одноуровневых асинхронных задач, но в сложных сценариях могут привести к аду обратных вызовов.
  • Обещания: улучшить читабельность и управляемость, позволяя создавать цепочки асинхронных операций. Встроенная обработка ошибок с помощью catch.
  • Async/Await: обеспечивает наиболее удобный для чтения и поддержки способ написания асинхронного кода. Упрощает обработку ошибок и выглядит как синхронный код.

Лучшие практики

  • Используйте Async/Await для большинства сценариев, в которых вам необходимо обрабатывать асинхронные операции. Он обеспечивает лучшую читабельность и простоту.
  • Используйте промисы, когда вам нужно последовательно выполнить несколько асинхронных операций или при использовании библиотек, возвращающих промисы.
  • Избегайте обратных вызовов за исключением случаев, когда вы работаете с устаревшим кодом или выполняете очень простые асинхронные задачи.

Заключение

Асинхронное программирование на JavaScript необходимо для создания адаптивных и эффективных приложений. Понимание различий между обратными вызовами, обещаниями и Async/Await позволяет разработчикам выбрать правильный инструмент для своего конкретного случая использования. Хотя обратные вызовы являются простейшей формой обработки асинхронных операций, они могут привести к неряшливому коду. Промисы предлагают более структурированный подход, но Async/Await обеспечивает наиболее элегантное и читаемое решение. Следуя передовым практикам и понимая эти инструменты, разработчики могут писать чистый, удобный в обслуживании и эффективный асинхронный код.

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/itsshaikhaj/asynchronous-programming-in-javascript-callbacks-vs-promises-vs-asyncawait-690?1 Если есть какие-либо нарушения, пожалуйста, свяжитесь с [email protected] удалить его
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3