Нет потоков в JavaScript. Поскольку весь ваш код выполняется только в одном потоке js, ожидается вывод.
Ваше неправильное представление о async
довольно распространено. Вы думаете, что async
подразумевает некоторую «фоновую работу», но это не так! В asyn c нет потока ! Внутри функции asyn c вы можете просто сказать: «Я сделал то, что хочу, но знаю, что мне нужно подождать ... может, позже я смогу продолжить ... вы можете заставить поток делать другие вещи». Но если начался другой материал, то этот другой выполняется до тех пор, пока он не будет выполнен (или снова вернет поток).
Чтобы получить ожидаемый результат, вам нужно будет вернуть выполнение к остальной части кода из внутри функции - но тем не менее он не является многопоточным и, следовательно, если получен ожидаемый результат, он не будет обработан, пока не будет выполнен текущий выполняемый код.
function resolveAfter2Seconds() {
return new Promise(resolve => {
setTimeout(() => {
resolve('resolved');
}, 2000);
});
}
async function asyncCall() {
console.log('calling');
const result = await resolveAfter2Seconds(); // we will wait and during that time the single thread executing our code can do other stuff
console.log(result);
// expected output: 'resolved'
}
function fnCall2() {
console.log('fn2');
for(var i=0;i<500;i++) { // this will not be interrupted!
console.log(i);
}
}
asyncCall();
fnCall2();
Результат asyncCall
будет получен через 2 секунды , но это не значит, что он обрабатывается немедленно. Если fn2 требуется больше времени, чем обработка результата задерживается. Попробуйте установить для fn2 значение 50000
- после этого сообщение resolve
всегда будет печататься.