Como o código Javascript se torna assíncrono ao usar retornos de chamada?

26

Venho lendo bastante on-line, tentando descobrir como escrever código JavaScript assíncrono. Uma das técnicas que surgiram muito em minha pesquisa é usar retornos de chamada. Embora eu entenda o processo de como escrever e executar uma função de retorno de chamada, estou confuso por que os retornos de chamada parecem automagicamente tornar a execução do JavaScript assíncrona. Então, minha pergunta é: como a adição de funções de retorno de chamada ao meu código JavaScript faz com que o código seja automaticamente assíncrono?

Zach Dziura
fonte
2
Você pode estar interessado em ler como o navegador consegue isso dentro de um único segmento, escrito por John Resig: ejohn.org/blog/how-javascript-timers-work
Jalayn
@Jalayn. Obrigado. Seu comentário fez toda a diferença depois de ler as várias respostas.
kushalvm

Respostas:

26

Não faz. Apenas receber um retorno de chamada ou passar uma chamada de retorno não significa que seja assíncrono.

Por exemplo, a .forEachfunção recebe um retorno de chamada, mas é síncrona.

var available = false;
[1,2,3].forEach( function(){
    available = true;
});
//code here runs after the whole .forEach has run,
//so available === true here

Também setTimeoutrecebe um retorno de chamada e é assíncrono.

function myFunction( fn ) {
    setTimeout( function() {
        fn(1,2,3);
    }, 0 );
}

var available = false;
myFunction( function() {
    available = true;
});
//available is never true here

Conectar-se a qualquer evento assíncrono em Javascript sempre exige um retorno de chamada, mas isso não significa que chamar funções ou distribuí-las é sempre assíncrono.

Esailija
fonte
2
@SteveEvers Acho que você poderia editar o artigo da MDN então. Retorno de chamada é um termo muito comum em javascript para qualquer função passada para outra que chama de volta usando a função que você deu ... por que complicar? Edit: Callback também é usado em especificações
Esailija
3
@SteveEvers "retorno de chamada implica assincronia" é uma idiossincrasia em C # / Microsoft. pt.wikipedia.org/wiki/Callback_(computer_programming)
Esailija
1
@ MikeBrown Eu acho que li muito em seu perfil e isso - a resposta mais votada certamente dá uma idéia de que "retornos de chamada implicam em assincronia".
precisa saber é o seguinte
1
Mas o que foi dito @SteveEvers também está errado. Os retornos de chamada não implicam assincronia, apenas que outra pessoa será responsável por "retornar a ligação".
Michael Brown
1
+1 porque Steve Evers está errado
slebetman
23

O segredo da "mágica" é que os eventos aos quais você está atribuindo retornos de chamada são assíncronos. Eles são implementados "sob o capô" para cuidar do que estão fazendo (como recuperar algo de um servidor remoto) em segundo plano, fora da sandbox JS. E depois que terminam seu trabalho, eles enviam uma mensagem ao mecanismo JS para chamar um evento. Quando o mecanismo JS é finalizado com o que está fazendo no momento, ele chama os eventos que estão na fila (ou espera por uma nova mensagem) e, em seguida, seu retorno de chamada é "magicamente" invocado de forma assíncrona!

( NOTA: Esta é uma visão geral conceitual de alto nível do tópico que não entra em detalhes, porque diferentes mecanismos JS implementam as coisas de maneiras diferentes. Mas essa é a ideia geral de como funciona.)

Mason Wheeler
fonte
Quais eventos são esses? Um exemplo de um ou dois desses eventos tornaria sua resposta ainda melhor.
Jo Smo