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 setTimeout
método, ele se torna uma execução assíncrona. Mas o JS retorna imediatamente e continua executando, que é chamado Non-Blocking
ou Async
. E continua trabalhando em outros etc.
Os resultados dessa execução são os seguintes:
acdb
Então, basicamente, o segundo setTimeout
foi 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 setTimeout
sejam 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 setTimeouts
enquanto o mecanismo JS aceita mais solicitações e as executa? Como o thread único continua trabalhando em outras solicitações? O que funciona setTimeout
enquanto outras solicitações continuam chegando e são executadas.
# 2: Se essas setTimeout
funçõ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 EventLoop
modo 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 the
palavra-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?