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?


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.


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.)


Quais eventos são esses? Um exemplo de um ou dois desses eventos tornaria sua resposta ainda melhor.
Jo Smo
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.