Обрабатывается ли цикл async / await и Promises одинаковым образом?
Цикл обработки событий - это просто обработка событий, я бы не сказал, что он вообще обрабатывает вещи по-разному. Разрешение обещания приведет к тому, что событие будет помещено в цикл, который затем вызовет все обработчики .then
на следующем тике, поскольку асинхронная функция также возвращает обещание и разрешает его, вы получаете то же поведение.
Они оба считаются микрозадачами?
Название «микрозадача» используется для объяснения общего поведения браузеров, ни спецификация, ни NodeJS не используют его, поэтому я бы никогда не сказал, что «xy - это микрозадача в JavaScript». Однако, если вы вызываете разрешение «микрозадачи», то возврат из асинхронной функции также является «микрозадачей», поскольку она разрешает основное обещание.
Есть ли какая-либо выигрыш в исполнении от использования одного над другим (например, код в исполнителе Promise вызывается синхронно, но как насчет асинхронных функций)?
Код всегда выполняется синхронно, асинхронность в JS означает, что внешние события (сетевые запросы, таймеры) когда-нибудь попадают в очередь событий, и поэтому код, присоединенный к нему через обратные вызовы, иногда вызывается, однако затем он выполняется синхронно.
Согласно MDN, асинхронная функция возвращает объект AsyncFunction, но в документации Promise это не обсуждается - какие преимущества имеет AsyncFunction?
Нет, он возвращает обещание, async function
сам по себе является объектом AsyncFunction, что просто означает, что это FunctionObject с внутренним значением, говорящим, что он асинхронный.
const asyncFunctionObject = new AsyncFunction("return await stuff();");
async functionObject() { return await stuff(); }
Одинаковы ли преимущества производительности (если есть)?
Может быть. Это всегда зависит от вашего конкретного варианта использования, поэтому, если вы хотите знать его, обязательно проверьте производительность. Однако если вы посмотрите на эти два примера:
// 1
a().then(() => b()).then(() => c())
// 2
(async function() {
await a();
await b();
await c();
})();
тогда в первом случае, если a, b и c - обещания, будет 5 обещаний (.then(...)
возвращает новое обещание), в то время как во втором примере требуется только 4 (одно возвращено асинхронной функцией). Для петель соотношение станет еще лучше.