2013-08-13 14 views
16

यह संभव है कि मैं नोड के ईवेंट लूप को पर्याप्त रूप से समझ नहीं पा रहा हूं।कॉलबैक() या वापसी कॉलबैक()

कहें कि मेरे पास एक कार्य foo है जिसमें एसिंक्रोनस फ़ंक्शन async_func है। मैं

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

या

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

उत्तर

26

वास्तव में अपने नमूना 2 में है, क्या, //never executed हर बार निष्पादित किया जाएगा। यह रैपिंग फ़ंक्शन से नहीं, कॉलबैक से वापस आ रहा है।

कभी-कभी कॉलर वास्तव में कुछ वापसी मूल्य की अपेक्षा करता है और उस पर निर्भर व्यवहार बदल सकता है। रिटर्न कॉलबैक() को देखने का एक अन्य आम कारण आपके द्वारा किए गए फ़ंक्शन को कम सर्किट करने का एक स्पष्ट तरीका है। उदाहरण के लिए।

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

हालांकि वापसी मान नहीं किया जा रहा है, यह वापसी उपयोग कर रहा है कि निष्पादन सशर्त त्रुटि अतीत जारी रखने के लिए नहीं है सुनिश्चित करने के लिए। आप इसे इस तरह से आसानी से लिख सकते हैं जिस पर एक ही प्रभाव पड़ता है।

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

इससे बहुत मदद मिलती है। धन्यवाद – Colin

+0

@ टिमोथी, अच्छा जवाब लेकिन '_.find' भ्रामक है और मैं सुझाव दूंगा कि आप इसे हटा दें। '_.find' तुल्यकालिक है और कॉलबैक नहीं लेता है। यह एक इटरेटर फ़ंक्शन लेता है, प्रोसेसिंग के दौरान इसका उपयोग करता है, लेकिन तब भी परिणाम सिंक्रनाइज़ करता है। यह उदाहरण सिर्फ लोगों को भ्रमित करेगा। –

+0

@ पीटर लाइन्स अच्छा बिंदु। हटा दिया। –