Я ожидаю, что вызов синхронной функции внутри asyn c должен блокировать поток перед выполнением следующего кода.
Это делает
Так что я ' я ожидаю получить 1 -> 2 -> 3 вместо этого я получаю 1 -> 3 -> 2.
setTimeout
является не синхронным. Это очень явно для постановки в очередь функции для запуска позже, по прошествии некоторого времени.
Не могу найти объяснение, почему это происходит и как заблокировать поток для получения вывода 1 -> 2 -> 3.
Сам по себе вы не можете.
Самое близкое, на что вы могли бы прийти, это заменить setTimeout
на al oop, который кружится по кругу, пока какое-то время прошло ... но это было бы ужасно (это заблокировало бы интерфейс для начинающих).
Если вы хотите просто запустить три журнала по порядку, то замените setTimeout
на что-то, что возвращает обещание, а затем await
it (который перевел бы функцию asyn c в спящий режим и позволил бы любому другому коду продолжать работать, пока обещание не будет выполнено).
const timeout = function() {
return new Promise(function(res) {
setTimeout(() => {
console.log(2);
res();
}, 2000)
})
};
const x = async() => {
console.log(1);
await timeout();
console.log(3);
}
x();