Promises have their own micro-queue, which has higher precedence over the task-queue.
Async functions are called synchronously. It is the awaited part of an async function that is run asynchronously. Everything before the await is run asynchronously.
Awaited results are cast to Promises and their values are not available until the next micro-task checkpoint. Micro-tasks are not executed until the script completes.