2013-08-13 23 views
16

Jest możliwe, że nie rozumiem wystarczająco dobrze pętli zdarzeń węzła.wywołanie zwrotne() lub zwrotne oddzwonienie()

Powiedz, że mam funkcję foo, która zawiera funkcję asynchroniczną async_func. Czy muszę

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

lub

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

Odpowiedz

26

Właściwie w próbce 2 //never executed będzie wykonać za każdym razem. Wraca z wywołania zwrotnego, a nie z funkcji zawijania.

Czasami osoba dzwoniąca faktycznie oczekuje pewnej wartości zwracanej, a zachowanie może się zmienić w oparciu o to. Innym często spotykanym powodem wywołania zwrotnego zwrotnego() jest prosty sposób zwarcia funkcji, w której się znajdujesz. Na przykład.

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

Choć wartość zwracana nie jest używany, to używając zwrotu w celu zapewnienia, że ​​wykonanie nie kontynuować przeszłość błędu warunkowego. Równie dobrze można napisać to w ten sposób, który ma taki sam efekt.

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

To pomaga znacznie lol. Dzięki – Colin

+0

@Tymothy, dobra odpowiedź, ale "_.find" jest mylące i proponuję usunąć go. '_.find' jest synchroniczne i nie przyjmuje wywołania zwrotnego. Zajmuje funkcję iteratora, używa go podczas przetwarzania, ale nadal zwraca wynik synchronicznie. Ten przykład po prostu pomyli ludzi. –

+0

@PeterLyons Dobry punkt. Oddalony. –

Powiązane problemy