2015-06-20 18 views
5

Sono molto confuso su questo programma. Ho comprato un libro intitolato "Node JS, MongoDB e AngularJS Web Development" di Brad Dayley. Ho trovato un programma per dimostrare qualcosa chiamato chiusura, e mostra questo programma come un esempio. Questa è solo la prima parte del programma.Callback() Nodo Js

function logCar(logMsg, callback){ 
    process.nextTick(function(){ 
     callback(logMsg); 
    }); 
} 

var cars = ["Ferrari", "Porsche", "Bugatti"]; 

for(var idx in cars){ 
    var message = "Saw a " + cars[idx]; 
    logCar(message, function(){ 
     console.log("Normal Callback: " + message); 
    }) 
} 

Ho cercato di capire come questo funzioni di programma per un'ora intera, ma non riesco a capire quale sia la funzione di callback (logmsg).

So che questa è probabilmente una domanda molto semplice, ma non riesco a capirlo.

risposta

2

callback è qualsiasi funzione passata a logCar(). Quando logCar completa l'esecuzione di qualsiasi cosa si supponga, chiama la funzione di callback. il vostro ciclo for All'interno, si chiama logCar() come questo ..

logCar(message, function(){ 
    console.log("Normal Callback: " + message); 
}) 

Qui, function() {..} è la funzione di callback e sarà chiamata una volta logCar è fatto esecuzione. In questo caso, la funzione di callback che hai fornito sarà il console.log il messaggio che hai passato come primo parametro. Potresti aver passato un'altra funzione che avrebbe eseguito qualcosa di diverso anche come callback.

+0

Perché callback (logMsg) supera la variabile logMsg? Non c'è nulla nei parametri della funzione anonima per tenerlo. – studentTrader24

+0

Tuttavia, la funzione di callback è stata definita per accettare tutto ciò che viene passato come primo parametro nella funzione 'logCar'. Quindi, qualsiasi funzione passata come callback prenderà automaticamente la variabile logMsg. –

+0

Alla fine della funzione logCar, si verifica callback (logMsg). Questo chiama la funzione anonima. Non capisco come o perché la variabile logMsg viene restituita. Se si osserva la funzione anonima, non c'è nulla nei parametri per "catturare" la variabile logMsg. – studentTrader24

2

Trovo che sia più facile avvolgere la mia mente seguendo il percorso di esecuzione più da vicino, in particolare il percorso che logMsg assume. Un buon debugger è ottimo per questo.

Non succede nulla fino al ciclo for, in cui è definita una variabile denominata messaggio. All'inizio sarà "Saw a Ferrari".

C'è anche una funzione anonima proprio accanto al "messaggio" che è purtroppo difficile da separare e definire. Perché sembra al di fuori del suo campo di applicazione per una variabile chiamata "messaggio" che è intrappolato dentro quel ciclo for, non abbiamo potuto fare sulla linea 6:

var someFunction = function(){ 
     console.log("Normal Callback: " + message); 
} 

... perché ciò che è "messaggio"? Niente al di fuori di quel ciclo ha accesso direttamente al "messaggio" (tranne che come chiusura, ma non preoccuparti ancora di ciò). Nota che questa funzione non verrà ancora eseguita. È appena stato creato a questo punto.

Quindi, successivamente, viene eseguito LogCar("Saw a Ferrari", someFunction...). Dov'è LogCar? Oh, la cima. Andiamo lì, ma per semplicità saltiamo process.nextTick. Essenzialmente someFunction("Saw a Ferrari") succede qui. Dov'è SomeFunction? Oh, quella è quella funzione anonima che non è ancora stata eseguita. Ora è arrivato il momento di eseguire. Quindi il processo torna indietro per vedere cosa c'è dentro ed eseguirlo, che è console.log("Saw a Ferrari");

Questo è fatto, e il processo si ripete per "Ho visto una Porsche".