Каков порядок выполнения при ожидании не-обещания?

Насколько я понимаю, обещание в выражении await promise помещается в очередь микрозадач, поэтому оно будет установлено после того, как стек вызовов станет пустым. Приведенный ниже код работает так, как я ожидал:

async function func() {
  console.info(await Promise.resolve('bagel'));
}

func();
console.info('synchronous log');

// Result:
// synchronous log
// bagel

Но если я await что-то не промис такой, то порядок логов менялся:

async function func() {
  await console.info('bagel');
}

func();
console.info('synchronous log');

// Result:
// bagel
// synchronous log

Что происходит за кадром, когда я звоню await? Каков порядок выполнения при ожидании не-промиса? А конкретно await console.info?

await console.info(…) не имеет смысла, это то же самое, что console.info(…); await undefined;. Вы наверное имели ввиду console.info(await 'bagel')?
Bergi 02.04.2023 10:48

«Насколько я понимаю, обещание помещается в очередь микрозадач» — нет, очередь задач не содержит обещаний. Задача (обработчик .then()), которая возобновляет выполнение функции async, помещается в очередь микрозадач после разрешения промиса.

Bergi 02.04.2023 10:50
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В вашем случае у вас есть

async function func() {
  let un = console.info('bagel');
  await un;
}

func();
console.info('synchronous log');

Так что порядок очевиден

В случае

async function func() {
  await 0;
  console.info('bagel');
}

func();
console.info('synchronous log');

синхронный тоже будет первым, так как await приостанавливает выполнение функции

Если вы хотите, чтобы ваше «синхронное» ожидание было синхронным, вы не должны ждать его, если это не обещание.

async function func(wait) {
  if (wait?.then) {
    await wait
  }
}

Другие вопросы по теме