2011-01-06 14 views
6

में Async झरना का उपयोग करते समय "गलती" तर्क, मैं कार्यों की एक श्रृंखला निष्पादित करने की कोशिश कर रहा हूं, प्रत्येक कॉलबैक को अगली बार पास कर रहा है। अभी यह (! किसी भी मामूली त्रुटियों बहाना, मैं इसे फिर से लिखने रहा हूँ के रूप में मैं पोस्ट) इस तरह दिखता है:नोड.जेएस

function func1(callback) { 
    callback(null, "stuff"); 
} 

function func2(input, callback) { 
    callback(null, "foo" + input); 
} 

async.waterfall([func1, func2], function(err, result) { 
    sys.puts(result); 
}); 

मेरा पहला सवाल यह है कि मुझे यकीन है कि कैसे इस समारोह शान से शुरू करने के लिए नहीं कर रहा हूँ, क्योंकि यह कर सकते हैं ' एक इनपुट ले लो। मैं अंततः एक स्थानीय समारोह में इसे लपेटने जा रहा हूं, लेकिन यह अभी भी मुझे थोड़ा असहज बनाता है।

दूसरा, जबकि यह काम करता है, मुझे नहीं पता कि "त्रुटि" तर्क इस में कैसे खेलता है। अगर मैं इसे तर्कों की सूची में डालने का प्रयास करता हूं, तो यह विभिन्न तरीकों से टूट जाता है। मैं व्यक्तिगत रूप से किसी भी फ़ंक्शन में त्रुटि प्राप्त करने में सक्षम होना चाहता हूं - या यह आवश्यक है, क्योंकि मुझे पिछली कॉलबैक पर एक त्रुटि है जो पारित हो गई है?

उत्तर

14

झरना सामान्य रूप से अज्ञात कार्यों के साथ प्रयोग किया जाता है, इसलिए पैरामीटर बाहरी दायरे से आते हैं।

err काम कैसे आसान है, जब आप कॉलबैक फ़ंक्शन के पहले तर्क के रूप में सत्य का मूल्यांकन करते हैं तो वॉटरफॉल बंद हो जाएगा और मुख्य कॉलबैक कॉल करेगा।

function doStuff(foo, bla) { 
    // more setup here 

    async.waterfall([ 
     function(callback){ 
      try { 
       // something that might explode 
       callback(null, foo, bla); 

      } catch (e) { 
       callback(e); 
      } 
     }, 

     function(arg1, arg2, callback){ 
      callback(null, 'three'); 
     }, 

     function(arg1, callback){ 
      callback(null, 'done'); 
     } 
    ], 

    function (err, status) { 
     // if the above try/catche catches something, we will end up here 
     // otherwise we will receive 'done' as the value of status 
     // after the third function has finished 
    }); 
} 
0

आप श्रृंखला में पहला कार्य करने के लिए एक इनपुट पारित करने के लिए async.constant उपयोग कर सकते हैं:

async.waterfall([ 
    async.constant(parameter), 
    func1, 
    func2 
], function (err, result) {    
}); 

और निश्चित रूप से पहले समारोह को संशोधित:

function func1(input,callback) { 
    callback(null, "stuff"); 
} 

वैकल्पिक: यदि आप गैर-शून्य पहले पैरामीटर के साथ कॉलबैक कॉल कर सकते हैं:

function func1(input,callback) { 
     callback("something"); 
    } 

इस मामले में श्रृंखला बंद कर दिया जाता है, और पिछले समारोह अं = "कुछ"

प्रलेखन के साथ बुलाया जाएगा: https://caolan.github.io/async/docs.html#constant और https://caolan.github.io/async/docs.html#waterfall

संबंधित मुद्दे