Executando verificação de segurança...
-1

Isso está muito errado. Sinceramente, não são surpresa os downvotes.

É uma desinformação produzida por consequência de analfabetismo funcional (quando você sabe ler a palavra, mas não sabe o significado).

Uma execução assíncrona não implica em processamento paralelo.

"Assíncrono" significa "que ocorreu fora de sincronia", ou em palavras mais simples "que ocorre em outro momento que não o momento da definição/deflagração".

Promises são assíncronas porque não se resolvem no momento em que são disparadas. Ou seja, o código posterior à deflagração da Promise é executado mesmo que a Promise não resolva. E a Promise é resolvida somente quando tudo que precisa estiver disponível. Ela fica aguardando a solução e só então é resolvida. É o mesmo caso dos eventos. A callback fica aguardando o evento ocorrer pra só então executar, portanto também é um procedimento assíncrono, porque não ocorre no momento da definição.

Portanto, sim, JavaScript também é assíncrono. E, mesmo que o PHP não tenha nativamente blocos de execussão assíncrona, nada impede uma implementação assíncrona (vide diversos pacotes disponíveis na internet para esta finalidade). Ainda, o PHP tem SplObserver e SplObservable, nativamente, que são mecanismos assíncronos, afinal, as funções só executam quando ocorre uma mudança/notificação.

Agora, se o assunto é processamento paralelo/concorrente, aí a história é outra.

Carregando publicação patrocinada...
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

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.