Executando verificação de segurança...
0

É 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

Carregando publicação patrocinada...
1

Parece que você insiste em não querer entender.

Assíncrono significa exclusivamente algo que ocorre fora do tempo, nada mais.

Não existe isso de que pra ser assíncrono é necessário ser concorrente (acontecer ao mesmo tempo, ou acontecer enquanto outra coisa acontece). As palavras são diferentes porque significam coisas diferentes.

O exemplo "tirando a prova" é assíncrono, mesmo que o resultado esteja ordenado, porque os resultados só são resolvido a cada 1ms. O runtime do resultado é diferente do runtime da invocação, ou seja, os timestamps não são o mesmo valor.

Se você quer algo concorrente, então é só instanciar um worker e pronto.