Eu estou pensando sobre isso e é isso que eu vim com:
Digamos que temos um código como este:
console.clear();
console.log("a");
setTimeout(function(){console.log("b");},1000);
console.log("c");
setTimeout(function(){console.log("d");},0);
Uma solicitação é recebida e o mecanismo JS começa a executar o código acima, passo a passo. As duas primeiras são de sincronização. Mas quando se trata de setTimeoutmétodo, ele se torna uma execução assíncrona. Mas o JS retorna imediatamente e continua executando, que é chamado Non-Blockingou Async. E continua trabalhando em outros etc.
Os resultados dessa execução são os seguintes:
acdb
Então, basicamente, o segundo setTimeoutfoi concluído primeiro e sua função de retorno de chamada é executada antes do primeiro, e isso faz sentido.
Estamos falando de aplicativos single-threaded aqui. O JS Engine continua executando isso e, a menos que termine a primeira solicitação, ela não passará para a segunda. Mas o bom é que não esperará que as operações de bloqueio setTimeoutsejam resolvidas, para que seja mais rápido porque aceita as novas solicitações recebidas.
Mas minhas perguntas surgem em torno dos seguintes itens:
# 1: Se estamos falando de um aplicativo de thread único, qual mecanismo processa setTimeoutsenquanto o mecanismo JS aceita mais solicitações e as executa? Como o thread único continua trabalhando em outras solicitações? O que funciona setTimeoutenquanto outras solicitações continuam chegando e são executadas.
# 2: Se essas setTimeoutfunções são executadas nos bastidores enquanto mais solicitações são recebidas e executadas, o que executa as execuções assíncronas nos bastidores? Sobre o que falamos sobre o que é chamado de EventLoop?
# 3: Mas o método inteiro não deve ser colocado no EventLoopmodo para que tudo seja executado e o método de retorno de chamada seja chamado? Isto é o que eu entendo quando falo sobre funções de retorno de chamada:
function downloadFile(filePath, callback)
{
blah.downloadFile(filePath);
callback();
}
Mas, neste caso, como o JS Engine sabe se é uma função assíncrona para poder colocar o retorno de chamada na EventLoop? Perhaps something like thepalavra-chave async` em C # ou algum tipo de atributo que indica que o método que o JS Engine adotará é um método assíncrono e deve ser tratado em conformidade.
# 4: Mas um artigo diz muito contrário ao que eu estava imaginando sobre como as coisas podem estar funcionando:
O loop de eventos é uma fila de funções de retorno de chamada. Quando uma função assíncrona é executada, a função de retorno de chamada é enviada para a fila. O mecanismo JavaScript não inicia o processamento do loop de eventos até que o código após a execução de uma função assíncrona.
# 5: E existe esta imagem aqui que pode ser útil, mas a primeira explicação na imagem está dizendo exatamente a mesma coisa mencionada na pergunta número 4:

Então, minha pergunta aqui é obter alguns esclarecimentos sobre os itens listados acima?