Потому что await работает только с Promise-like объектами, то есть объектами имеющими метод then()
Под капотом await работает примерно следующим образом:
// пусть value - результат операции справа от await
// resolve - функция, которая получает 1 аргумент, который вернет await
// (но не раньше выполнения микротасков event loop)
// reject - функция, которая получает 1 аргумент, который пробросит исключение в await
// (но не раньше выполнения микротасков event loop)
if(value && typeof value.then === 'function') {
value.then(resolve, reject);
} else {
resolve(value);
}
Про event loop, а так же что в нем микротаски - гуглите. Скажу лишь одно, микротаски выполняются на каждой итерации event loop притом все сразу, пока не закончатся.
console.log синхронный, оборачивание его в await не даст результата, кроме разве что следующее действие (которого в примере нет) будет выполнено в следующем микротаске, но по сути сразу же
setTimeout - асинхронный, но на колбэках, необходимо либо обернуть его в Promise либо в Promise-like объект.
Вариант с Promise:
async function my_function() {
console.log('1');
await new Promise(resolve => setTimeout(resolve, 1000));
console.log('2');
console.log('3');
}
Вариант с Promise-like:
async function my_function() {
console.log('1');
await {then(resolve) { setTimeout(resolve, 1000); }};
console.log('2');
console.log('3');
}