É você estaria certo, SE javascript funcionasse assim, mas não é o caso, quando você faz:
async function exemplo() {
console.log("Olá mundo!");
}
O que acontece internamente é:
function exemplo() {
return function(...args) {
return new Promise((resolve, reject) => {
try {
// Tenta resolver
const result = console.log("Olá mundo!");
if (result instanceof Promise) {
//Ainda não tá pronto, empilha essa Promisse no final da fila
result.then(resolve).catch(reject);
} else {
// Opa, tá pronto empilhe as funções passadas em then
// e libere o fluxo
resolve(result);
}
} catch (error) {
// Deu algum erro empilhe as funções passadas em catch
// e libere o fluxo
reject(error);
}
});
};
}
Ou seja, quando você chama exemplo();
, a chamada de exemplo é síncrona mas ele coloca na fila de mensagem, (Message Queue), após cada chamada de função ou término de bloco javascript vai percorrer essa fila e de forma síncrona e por tanto bloqueante vai tentar resolver as promisses, resolveu? Ótimo, empilhe se houver na fila de micro tarefas, e percorra a fila de microtarefas colocando elas na callstack, as funcões passadas em then
, deu ruim? Empilhe as funcões passadas em catch
, ainda não resolveu? Empilhe a promise resultante da chamada no final da fila, e pula pra próxima, verificou toda a fila? Volta pra callstack e repete o ciclo, isso é o tal "Loop de Eventos", sem uma pilha de chamada extra não é assincrono, parece assincrono, em uma linguagem assíncrona você tem algo chamado concorrência mesmo sendo single treads, em Lua (que é a mais simples de evidenciar) que é puramente síncrona por design permitindo assincronismo por corrotinas para ela ser assíncrona basta instanciar um lua_state
pra cada chamada assíncrona, aí sim teremos assincronia, inclusive a saída:
Inicio
Fim
undefined
1
2
3
4
5
6
7
8
9
10
11
É estatisticamente improvável, para o exemplo "tirando a prova", ele é um resultado síncrono com uma prova, as chances disso acontecer em uma linguagem assíncrona são de 1 em 11! ou seja 1 em 39.916.800, ou em percentual 0.0000025%< exemplo de tirando a prova