Вопрос проверяет понимание различий между цепочками промисов и синтаксисом async/await, что важно для написания читаемого и корректного асинхронного кода.
Промисы в JavaScript позволяют работать с асинхронными операциями. Получить результат можно двумя способами: через методы .then() и .catch() или через оператор await внутри async-функции. Оба подхода основаны на одном и том же механизме промисов, но отличаются стилем и удобством.
Метод .then() принимает колбэк, который выполнится при успешном завершении промиса, а .catch() — при ошибке. Это позволяет строить цепочки:
fetch('/api/user')
.then(res => res.json())
.then(user => console.log(user))
.catch(err => console.error(err));Такой код легко читается на коротких цепочках, но при ветвлении и вложенности становится громоздким. Обработка ошибок требует отдельного .catch() в конце цепочки.
await приостанавливает выполнение async-функции до разрешения промиса и возвращает его результат. Ошибки ловятся обычным try/catch:
async function loadUser() {
try {
const res = await fetch('/api/user');
const user = await res.json();
console.log(user);
} catch (err) {
console.error(err);
}
}Код выглядит как синхронный, что упрощает чтение и отладку. Однако await можно использовать только внутри async-функции (или на верхнем уровне модуля в современных средах).
Итог: используйте async/await для сложной логики и читаемости, а .then/.catch — для простых случаев или когда нужно вернуть промис без создания async-функции.