2013-12-16 12 views
6

में वादे करता है मैं Q लाइब्रेरी और async लाइब्रेरी नोडजेज़ में उपयोग कर रहा हूं।async और Q nodejs

यहाँ मेरी कोड का एक उदाहरण है:

async.each(items, cb, function(item) { 

saveItem.then(function(doc) { 
    cb(); 
}); 

}, function() { 

}); 

saveItem एक वादा है। जब मैं इसे चलाता हूं, तो मुझे हमेशा cb is undefined मिलता है, मुझे लगता है कि then() तक पहुंच नहीं है। कोई विचार यह कैसे काम करता है?

उत्तर

20

आपका मुद्दा वादे के साथ झूठ नहीं है, यह async के आपके उपयोग के साथ निहित है।

async.each(items, handler, finalCallback)handleritems सरणी के प्रत्येक आइटम पर लागू होता है। handler फ़ंक्शन एसिंक्रोनस है, यानी इसे कॉलबैक सौंप दिया गया है, जब इसे अपना काम पूरा करने पर कॉल करना होगा। जब सभी हैंडलर किए जाते हैं, तो अंतिम कॉलबैक कहा जाता है। विशेष रूप से वादे अकेले काफी अच्छी तरह से इस काम को भरने,:

var handler = function (item, cb) { 
    saveItem(item) 
    .then(
    function() { // all is well! 
     cb(); 
    }, 
    function (err) { // something bad happened! 
     cb(err); 
    } 
); 
} 

var finalCallback = function (err, results) { 
    // ... 
} 

async.each(items, handler, finalCallback); 

हालांकि, अगर आप कोड के इस विशेष टुकड़े के लिए async उपयोग करने की आवश्यकता नहीं है:

यहाँ कैसे आप अपने वर्तमान मुद्दे को ठीक करेंगे Q.all():

// Create an array of promises 
var promises = items.map(saveItem); 

// Wait for all promises to be resolved 
Q.all(promises) 
.then(
    function() { // all is well! 
     cb(); 
    }, 
    function (err) { // something bad happened! 
     cb(err); 
    } 
) 
+0

'Q.all' का उपयोग करके सही काम करता है, धन्यवाद! – dzm

+0

महान आप 'Q.all' समाधान उल्लेख – Krym

+0

हॉट कोड। निश्चित रूप से मजेदार और लाभ के लिए इसका उपयोग करेंगे। :) – Antoine