Какой инструмент синтетического сахара используют для работы с асинхронным кодом вместо промисов
Что проверяют
Знаете ли вы, что async/await не заменяет промисы, а работает поверх них. Сразу за этим спрашивают про обработку ошибок и про то, как запустить несколько запросов параллельно, а не друг за другом.
Как отвечать
Правильное название: синтаксический сахар async/await, он появился в ES2017.
async-функция всегда возвращает промис.return valueпревращается в выполненный промис,throwв отклонённый;awaitприостанавливает только текущую функцию до завершения промиса, основной поток не блокируется. Продолжение ставится в очередь микрозадач, как колбэк.then();- ошибки: отклонённый промис под
awaitвыбрасывается как исключение и ловится обычнымtry/catch/finally; - параллельность: два
awaitподряд выполняются последовательно. Независимые запросы запускают вместе черезPromise.all([...]), а если нужны результаты и при частичных отказах, черезPromise.allSettled; - top-level
await: разрешён в ES-модулях, в обычных скриптах нет.
Хорошо показать связь с генераторами: раньше то же поведение делали генератором и раннером вроде co, а Babel и TypeScript при компиляции в старый стандарт превращают async в конечный автомат.
Пример из фронтенда: колбэк useEffect в React нельзя сделать асинхронным, потому что он должен вернуть функцию очистки, а не промис. Асинхронную функцию объявляют внутри эффекта, а запрос отменяют через AbortController при размонтировании.
Где спотыкаются
Ставят await в цикле for для независимых запросов и получают сумму задержек вместо максимальной. Или пишут array.forEach(async ...) и удивляются, что код после цикла ничего не ждёт: forEach возвращённые промисы игнорирует.
Думают, что try/catch поймает ошибку, когда внутри забыли await. Промис без await отклоняется уже за пределами блока и превращается в unhandledrejection.
Говорят, что async/await делает код многопоточным. JavaScript остаётся однопоточным, асинхронность обеспечивает цикл событий, а настоящая параллельность в браузере достигается через Web Workers.