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

25

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

    
posta Zach Dziura 10.04.2013 - 18:56
fonte

2 risposte

24

Non è così. Basta prendere una richiamata o passare una richiamata non significa che sia asincrona.

Ad esempio, la funzione .forEach accetta una richiamata 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 setTimeout prende 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 non è così significa chiamare le funzioni o passarle in giro è sempre asincrono.

    
risposta data 10.04.2013 - 19:43
fonte
24

Il segreto della "magia" è che gli eventi a cui stai assegnando i callback sono asincroni. Sono implementati "sotto il cofano" per occuparsi di qualsiasi cosa stiano facendo (come il recupero di qualcosa da un server remoto) in background, al di fuori della sandbox JS. E quando hanno finito con il loro lavoro, danno al motore JS un messaggio per chiamare un evento. Quando il motore JS ha finito con qualsiasi cosa stia facendo, chiamerà tutti gli eventi che sono in coda (o attendi un nuovo messaggio) e quindi il callback è "magicamente" richiamato in modo asincrono!

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

    
risposta data 10.04.2013 - 19:03
fonte

Leggi altre domande sui tag