← Назад ко всем вопросам

Чем отличается Promise.resolve/reject от throw в async функции?

1️⃣ Как кратко ответить

В async функции Promise.resolve() возвращает успешно завершенный промис, Promise.reject() возвращает отклоненный промис, а throw выбрасывает исключение, которое автоматически преобразуется в отклоненный промис.

2️⃣ Подробное объяснение темы

В JavaScript async функции всегда возвращают промис. Это значит, что независимо от того, что происходит внутри функции, результат будет обернут в промис. Рассмотрим, как работают Promise.resolve(), Promise.reject() и throw в контексте async функций.

Promise.resolve()

Когда внутри async функции вызывается Promise.resolve(value), это означает, что функция возвращает успешно завершенный промис с указанным значением. Это полезно, когда вы хотите явно указать, что операция завершилась успешно.

async function exampleResolve() {
    return Promise.resolve('Success');
}
​
exampleResolve().then(result => {
    console.log(result); // Выведет: Success
});
  • async function exampleResolve() — объявление асинхронной функции.
  • return Promise.resolve('Success') — возвращает успешно завершенный промис с результатом 'Success'.
  • exampleResolve().then(...) — обрабатывает успешно завершенный промис и выводит результат.

Promise.reject()

Promise.reject(reason) используется для возврата отклоненного промиса с указанной причиной. Это позволяет явно указать, что операция завершилась с ошибкой.

async function exampleReject() {
    return Promise.reject('Error occurred');
}
​
exampleReject().catch(error => {
    console.log(error); // Выведет: Error occurred
});
  • async function exampleReject() — объявление асинхронной функции.
  • return Promise.reject('Error occurred') — возвращает отклоненный промис с причиной 'Error occurred'.
  • exampleReject().catch(...) — обрабатывает отклоненный промис и выводит ошибку.

throw

В async функции оператор throw используется для выброса исключения. Однако, в контексте async функции, выброшенное исключение автоматически преобразуется в отклоненный промис. Это значит, что throw и Promise.reject() в async функции ведут себя схожим образом.

async function exampleThrow() {
    throw new Error('Something went wrong');
}
​
exampleThrow().catch(error => {
    console.log(error.message); // Выведет: Something went wrong
});
  • async function exampleThrow() — объявление асинхронной функции.
  • throw new Error('Something went wrong') — выбрасывает исключение, которое преобразуется в отклоненный промис.
  • exampleThrow().catch(...) — обрабатывает отклоненный промис и выводит сообщение об ошибке.

Сравнение

  • Promise.resolve() и Promise.reject() возвращают промисы с явным указанием результата или ошибки.
  • throw в async функции автоматически преобразуется в отклоненный промис, аналогично Promise.reject().
  • Использование throw более интуитивно для обработки ошибок, так как оно ближе к традиционной модели обработки исключений в JavaScript.

Тема: JavaScript
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки