2013-08-13 4 views
16

Il est possible que je ne comprenne pas assez bien la boucle d'événement de Node. Dire que j'ai une fonction foo qui contient une fonction asynchrone async_func.callback() ou return callback()

Dois-je

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

ou

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

Répondre

26

En fait, dans l'échantillon 2, //never executed sera exécuter chaque fois. Il revient du rappel, pas de la fonction d'emballage.

Parfois, l'appelant attend réellement une valeur de retour et le comportement peut changer en fonction de cela. Une autre raison courante de voir un callback de retour() est juste une manière claire de court-circuiter la fonction dans laquelle vous vous trouvez. Par exemple.

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

Même si la valeur de retour ne soit pas utilisé, il utilise le retour pour assurer que l'exécution ne continue pas au-delà de l'erreur conditionnelle. Vous pourriez tout aussi bien l'écrire de cette façon, ce qui a le même effet.

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

Cela aide mucho lol. Merci – Colin

+0

@Timothy, bonne réponse mais le «_.find» est trompeur et je vous suggère de le supprimer. '_.find' est synchrone et ne prend pas de rappel. Il prend une fonction d'itérateur, l'utilise pendant le traitement, mais retourne quand même un résultat de manière synchrone. Cet exemple va simplement perturber les gens. –

+0

@PeterLyons Bon point. Supprimé –