2012-04-30 6 views
48

मैं lib async नोड उपयोग कर रहा हूँ के साथ async.foreach - async lib का उपयोग करना। एक बार पूरा होने पर मैं कॉलबैक निष्पादित करना चाहता हूं।Node.js - <a href="https://github.com/caolan/async#forEach" rel="noreferrer">https://github.com/caolan/async#forEach</a> और एक वस्तु के माध्यम से पुनरावृति और अपनी अनुक्रमणिका कुंजी बाहर प्रिंट करना चाहते हैं - वस्तु

यहाँ है क्या मैं अब तक है, लेकिन 'iterating done' देखा कभी नहीं किया गया है:

async.forEach(Object.keys(dataObj), function (err, callback){ 
     console.log('*****'); 

    }, function() { 
     console.log('iterating done'); 
    }); 
  1. क्यों अंतिम समारोह नहीं कहा जाता है?

  2. मैं ऑब्जेक्ट इंडेक्स कुंजी कैसे मुद्रित कर सकता हूं?

उत्तर

114

अंतिम समारोह बुलाया नहीं प्राप्त करता है क्योंकि async.forEach आवश्यकता है कि आप प्रत्येक तत्व के लिए callback फ़ंक्शन को कॉल करें।

कुछ इस तरह का प्रयोग करें:

async.forEach(Object.keys(dataObj), function (item, callback){ 
    console.log(item); // print the key 

    // tell async that that particular element of the iterator is done 
    callback(); 

}, function(err) { 
    console.log('iterating done'); 
}); 
+0

धन्यवाद @stewe मुझे पता था कि यह कुछ आसान था! सम्मान, बेन। – Ben

+3

उपरोक्त कोड प्रत्येक पुनरावृत्ति के लिए 'कॉलबैक' फ़ंक्शन नहीं करता है? यह कुछ 'गिनती ++ की तरह होना चाहिए; यदि (dataObj.length == गिनती) कॉलबैक(); 'जहां नया चर' var count = 1; '' async.forEach' लूप को कॉल करने से पहले घोषित किया गया है ?? –

+1

इसके लिए बहुत बहुत धन्यवाद! –

0

async.each बहुत उपयोगी और शक्तिशाली समारोह जो Async लिब 3 क्षेत्रों 1-संग्रह/सरणी है .it 2- यात्रा 3-कॉलबैक द्वारा प्रदान की गई है संग्रह को सरणी या वस्तुओं के संग्रह के संदर्भ में संदर्भित किया जाता है और पुनरावृत्ति प्रत्येक पुनरावृत्ति को संदर्भित करती है और कॉलबैक वैकल्पिक है। यदि हम कॉलबैक दे रहे हैं तो यह प्रतिक्रिया वापस कर देगा या परिणाम देगा जो आप अग्रिम में आपको दिखाना चाहते हैं

समानांतर में प्रत्येक आइटम को फ़ंक्शन इटेटेट को लागू करता है। Iteratee सूची से एक आइटम के साथ बुलाया जाता है, और जब यह समाप्त हो गया है के लिए एक कॉलबैक कहा जाता है। अगर iteratee अपने कॉलबैक में कोई त्रुटि गुजरता है, तो मुख्य कॉलबैक (प्रत्येक फ़ंक्शन के लिए) को तुरंत त्रुटि के साथ बुलाया जाता है।

नोट, चूंकि यह फ़ंक्शन समानांतर में प्रत्येक आइटम को लागू करता है, इस बात की कोई गारंटी नहीं है कि इटारेट फ़ंक्शन क्रम में पूरा हो जाएंगे।

exapmle-

var updateEventCredit = function (userId, amount ,callback) { 
    async.each(userId, function(id, next) { 
    var incentiveData = new domain.incentive({ 
    user_id:userId, 
     userName: id.userName, 
     amount: id.totalJeeneePrice, 
     description: id.description, 
    schemeType:id.schemeType 
    }); 

    incentiveData.save(function (err, result) { 
     if (err) { 
      next(err); 
     } else { 
       domain.Events.findOneAndUpdate({ 
        user_id: id.ids 
       }, { 
        $inc: { 
         eventsCredit: id.totalJeeneePrice 
        } 
       },{new:true}, function (err, result) { 
        if (err) { 
         Logger.info("Update status", err) 
         next(err); 
        } else { 
        Logger.info("Update status", result) 
        sendContributionNotification(id.ids,id.totalJeeneePrice); 
        next(null,null);  
        } 
       }); 
     } 
    }); 
संबंधित मुद्दे