Назад к вопросам
Junior
79
questionbank

Сколько существует способов выполнения асинхронных операций в JavaScript?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

3 основных: колбэки, промисы и async/await.

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

    // Пример с колбэком
    function fetchData(callback) {
      setTimeout(() => {
        callback(null, 'Данные получены');
      }, 1000);
    }
    
    fetchData((error, data) => {
      if (error) {
        console.error(error);
        return;
      }
      console.log(data); // Выведет "Данные получены" через 1 секунду
    });
    

    Недостаток: "callback hell" при большом количестве вложенных асинхронных операций.

  2. Промисы (Promises): Объекты, представляющие конечное завершение (или сбой) асинхронной операции и ее результирующее значение. Имеют три состояния: pending, fulfilled и rejected.

    // Пример с промисом
    function fetchDataPromise() {
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          // resolve('Данные получены через промис'); // Успех
          reject('Ошибка получения данных'); // Провал
        }, 1000);
      });
    }
    
    fetchDataPromise()
      .then(data => {
        console.log(data);
      })
      .catch(error => {
        console.error(error); // Выведет "Ошибка получения данных" через 1 секунду
      })
      .finally(() => {
        console.log('Промис завершен');
      });
    

    Преимущества: Улучшенная читабельность и управление ошибками по сравнению с колбэками.

  3. async/await: Синтаксический сахар над промисами, позволяющий писать асинхронный код, который выглядит как синхронный.

    // Пример с async/await
    function fetchDataAsync() {
      return new Promise((resolve) => {
        setTimeout(() => {
          resolve('Данные получены через async/await');
        }, 1000);
      });
    }
    
    async function processData() {
      try {
        const data = await fetchDataAsync(); // Ждем выполнения промиса
        console.log(data); // Выведет "Данные получены через async/await" через 1 секунду
      } catch (error) {
        console.error(error);
      }
    }
    
    processData();
    

    Преимущества: Наиболее понятный синтаксис для работы с асинхронностью, удобное управление ошибками с помощью try...catch.