Асинхронный код в JavaScript стал проще с появлением
async/await, но у него есть коварная ловушка: ошибки в промисах могут «утекать» и не обрабатываться. Это приводит к UnhandledPromiseRejection, который проявляется далеко не сразу и часто маскирует настоящую причину бага.Решение — всегда оборачивать асинхронный код в обработку ошибок. На уровне функции это try/catch:
async function fetchData(url) {
try {
const res = await fetch(url)
if (!res.ok) {
throw new Error(`HTTP error: ${res.status}`)
}
return await res.json()
} catch (err) {
console.error("Ошибка при получении данных:", err)
throw err // пробрасываем выше, если нужно
}
}
Но есть нюансы:
– Локальный
try/catch хорош для точечной обработки (например, показать пользователю алерт).– Глобальная обработка нужна для неожиданных ошибок: в браузере это
window.onunhandledrejection, в Node.js — process.on('unhandledRejection').– Параллельные вызовы лучше обрабатывать через
Promise.allSettled(), чтобы ошибка одного промиса не обрушала весь батч.