2013-08-13 18 views
16

Es ist möglich, dass ich die Ereignisschleife von Node nicht gut genug verstehe.callback() oder return callback()

Angenommen, ich habe eine Funktion foo, die eine asynchrone Funktion async_func enthält. Muss ich

//1 
function foo(callback) { 
     //stuff here 
     async_func(function() { 
      //do something 
      callback(); 
     }); 
//this eventually get executed 
} 

oder

//2 
function foo(callback) { 
     //stuff here 
     async_func(function() { 
      //do something 
      return callback(); 
     }); 
//never executed 
} 

Antwort

26

Eigentlich in Ihrer Probe 2 wird //never executed jedes Mal auszuführen sein. Es kommt vom Rückruf zurück, nicht von der Umbruchfunktion.

Manchmal erwartet der Aufrufer tatsächlich einen Rückgabewert und das Verhalten kann sich davon abhängig ändern. Ein weiterer häufiger Grund, einen Rückruf() zu sehen, ist nur eine klare Möglichkeit, die Funktion, in der Sie sich befinden, kurzzuschließen. Zum Beispiel.

function doSomething(callback) { 
    something(function(err, data) { 
     if(err) return callback(err); 
     // Only run if no error 
    }); 
    // Always run 
} 

Auch wenn der Rückgabewert nicht verwendet wird, ist es mit Rückkehr, dass die Ausführung gewährleisten bedingten nicht weiter vorbei an den Fehlern. Man könnte es genauso gut auf diese Weise schreiben, was den gleichen Effekt hat.

function doSomething(callback) { 
    something(function(err, data) { 
     if(err) { 
      callback(err); 
      return; 
     } 
     // Only run if no error 
    }); 
    // Always run 
} 
+0

Das hilft mucho lol. Danke – Colin

+0

@Timothy, gute Antwort, aber die '_.find' ist irreführend und ich würde vorschlagen, dass Sie es entfernen. '_.find' ist synchron und nimmt keinen Rückruf entgegen. Sie benötigt eine Iterator-Funktion, verwendet sie während der Verarbeitung, gibt dann aber ein Ergebnis synchron zurück. Dieses Beispiel wird die Leute nur verwirren. –

+0

@PeterLyons Guter Punkt. Entfernt. –