In che modo il codice Javascript diventa asincrono quando si utilizzano i callback?


26

Ho letto molto online cercando di capire come scrivere codice JavaScript asincrono. Una delle tecniche che è emersa molto nella mia ricerca è quella di utilizzare i callback. Mentre comprendo il processo su come scrivere ed eseguire una funzione di callback, sono confuso perché i callback sembrano rendere automagicamente asincrona l'esecuzione di JavaScript. Quindi, la mia domanda è: in che modo l'aggiunta delle funzioni di callback al mio codice JavaScript rende il codice automagicamente asincrono?


2
Potresti essere interessato a leggere come il browser raggiunge questo in un unico thread, scritto da John Resig: ejohn.org/blog/how-javascript-timers-work
Jalayn,

@Jalayn. Grazie. Il tuo commento ha fatto la differenza dopo aver letto le diverse risposte.
kushalvm,

Risposte:


26

Non Basta prendere una richiamata o passare una richiamata non significa che sia asincrono.

Ad esempio, la .forEachfunzione accetta un callback ma è sincrona.

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

Anche setTimeoutprende un callback ed è asincrono.

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

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

L'aggancio a qualsiasi evento asincrono in Javascript richiede sempre una richiamata, ma ciò non significa che le funzioni di chiamata o il loro passaggio sia sempre asincrono.


2
@SteveEvers Immagino che potresti modificare l' articolo MDN allora. Callback è un termine molto comune in JavaScript per qualsiasi funzione passata a un altro che ti richiama utilizzando la funzione che hai dato ... perché complicarlo? Modifica: Callback è anche usato nelle specifiche
Esailija

3
@SteveEvers "callback implica asyncrony" è un'idiosincrasia C # / Microsoft. en.wikipedia.org/wiki/Callback_(computer_programming)
Esailija

1
@MikeBrown Immagino di aver letto troppo nel suo profilo e questo - la risposta più votata dà sicuramente l'idea che "i callback implicano l'asincronia".
Esailija,

1
Ma detto questo @SteveEvers è anche sbagliato. I callback non implicano l'asincronia, ma solo che qualcun altro sarà responsabile di "richiamare".
Michael Brown,

1
+1 perché Steve Evers ha torto
slebetman l'

23

Il segreto della "magia" è che gli eventi a cui si stanno assegnando i callback sono asincroni. Sono implementati "sotto il cofano" per prendersi cura di tutto ciò che stanno facendo (come recuperare qualcosa da un server remoto) in background, al di fuori della sandbox JS. E poi, una volta terminato il loro lavoro, danno al motore JS un messaggio per chiamare un evento. Quando il motore JS avrà terminato qualsiasi cosa stia facendo, chiamerà tutti gli eventi in coda (o attenderà un nuovo messaggio) e quindi il tuo callback verrà invocato "magicamente" in modo asincrono!

( NOTA: questa è una panoramica concettuale di alto livello dell'argomento che non entra nei dettagli, perché diversi motori JS implementeranno le cose in modi diversi. Ma questa è l'idea generale di come funziona.)


Quali eventi sono questi? Un esempio di uno o due di questi eventi renderebbe la tua risposta ancora migliore.
Jo Smo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.