Сравни способы реализации асинхронности и объясни, когда выбирать каждый вариант.
Асинхронность и Event Loop
Асинхронность в JavaScript реализуют колбэками, промисами и async/await; для параллельного выполнения — комбинаторами Promise. Выбор зависит от читаемости и задачи.
Способы
Колбэки
getUser(id, (user) => getPosts(user, (posts) => render(posts)));Минус: вложенность («callback hell»), сложная обработка ошибок.
Промисы
getUser(id).then(getPosts).then(render).catch(handleError);Плоские цепочки, единый catch, комбинаторы.
async/await
try {
const user = await getUser(id);
const posts = await getPosts(user);
} catch (e) { handleError(e); }Синхронный вид, удобный try/catch — современный дефолт.
Параллельность
const [a, b] = await Promise.all([fetchA(), fetchB()]);Как выбирать
- Новый код → async/await (читаемость).
- Несколько независимых операций → Promise.all/allSettled.
- Потоковые события/подписки → не промисы, а
EventEmitter/Observable(RxJS). - Колбэки — в основном legacy и низкоуровневые API.
Коротко для собеседования
Асинхронность: колбэки (legacy, вложенность), промисы (цепочки, catch), async/await (синхронный вид, try/catch) — современный выбор. Для параллельного выполнения — Promise.all/allSettled, для потоков событий — Observable.