Так работают асинхронные вызовы.
Как вы думаете, на что похоже выполнение кода:
function delay(ms: number) {
return new Promise<void>(function(resolve) {
setTimeout(resolve, ms);
});
}
async function asyncAwait() {
console.log("A");
await delay(1000);
console.log("B");
await delay(1000);
console.log("C");
}
asyncAwait(); // <-- 1st call
console.log("D");
Затем внутри этой функции:
async function asyncAwait() {
console.log("A"); // <--- 1st print, as it is synchronous
await delay(1000); // <--- await
console.log("B"); // <--- 2nd print
await delay(1000); // <-- await
console.log("C"); // <-- 3rd print
}
И, наконец,
function delay(ms: number) {
return new Promise<void>(function(resolve) {
setTimeout(resolve, ms);
});
}
async function asyncAwait() {
console.log("A");
await delay(1000);
console.log("B");
await delay(1000);
console.log("C");
}
asyncAwait();
console.log("D"); // <-- last print
НО, асинхронная функция асинхронная.Таким образом, все асинхронные вызовы поступают в очередь и обрабатываются позже.
Следовательно, сначала выполняются синхронные вызовы:
console.log("A");
console.log("D");
А затем асинхронные вызовы.
await
работает только внутри функции async
.
Таким образом, функция:
async function asyncFunc() {
console.log("A");
await delay(1000);
console.log("B");
}
примерно соответствует следующему:
asyncFunc() {
console.log('A');
delay().then(()=> {
console.log('B');
});
}
Так что если вычтобы консольный файл ("D") выполнялся после асинхронной функции, вы должны ожидать asyncFunction.Но чтобы использовать await, вы должны быть в асинхронной функции:
async function asyncFunc2() {
await asyncAwait();
console.log("D");
}
asyncFunc2();