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

В чем разница между async/await и Promise?

Sobes Copilot

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

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

sobes.tech AI

Async/await — это синтаксический сахар над промисами, облегчающий работу с асинхронным кодом. Он позволяет писать асинхронные операции в более синхронном стиле, делая код более читабельным и легким для понимания по сравнению с цепочками .then() и .catch().

Promise

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

  • pending: Начальное состояние, не выполнен и не отклонен.
  • fulfilled: Операция успешно завершена.
  • rejected: Операция завершилась ошибкой.

Промисы используются с методами .then() для обработки успешного результата и .catch() для обработки ошибок.

// Пример использования Promise
function delay(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

delay(1000)
  .then(() => {
    console.log('Задержка 1 секунда завершена');
  })
  .catch(error => {
    console.error('Произошла ошибка:', error);
  });

async/await

Основан на промисах. Функции, объявленные с ключевым словом async, всегда возвращают промис. Внутри такой функции можно использовать ключевое слово await перед выражением, которое возвращает промис. await останавливает выполнение async-функции до тех пор, пока промис не будет выполнен или отклонен, и возвращает его результирующее значение.

// Пример использования async/await
function delay(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function runDelayedCode() {
  try {
    await delay(1000); // Ждем выполнения промиса
    console.log('Задержка 1 секунда завершена');
  } catch (error) {
    console.error('Произошла ошибка:', error);
  }
}

runDelayedCode();

Основные различия:

Особенность Promise async/await
Синтаксис Цепочки .then(), .catch() Последовательный код, использование await
Читабельность Может быть сложным с большим количеством .then() Более читабелен, напоминает синхронный код
Обработка ошибок С помощью .catch() или вторым аргументом .then() С помощью блока try...catch
Вложенность Может приводить к "аду колбэков" (callback hell) Устраняет "ад колбэков", более плоский код
Работа с циклами Сложнее управлять последовательностью Проще использовать стандартные циклы (for, while)