2012-01-05 10 views
5

पूरा करने के लिए तो मैं कोड है कि तरह दिखता है:Node.js - कई कार्यों के लिए प्रतीक्षा की जा रही

var data = someobject; 

for(var x in data){ 
    mongo.findOne({ _id:data[x]._id },function(e,post){ 
     if(post != null){ 

      post.title = 'omg updated'; 
      post.save(function(){ 
       console.log('all done updating'); 
      }); 

     } 
    }); 
} 

// I need all^those functions to be done before continuing to the following function: 
some_function(); 

मैं Async पुस्तकालय है, जो मैं समानांतर के लिए उपयोग जब मैं कार्यों की एक निर्धारित संख्या है में देखा है मैं 1 बार चलाने की जरूरत है। लेकिन मुझे यकीन नहीं है कि वांछित प्रभाव को कैसे पूरा किया जाए।

ये सभी कार्य समानांतर में चल सकते हैं, मुझे बस यह जानने की आवश्यकता है कि सभी कब किए जाते हैं।

+0

मुझे यकीन है कि नहीं कर रहा हूँ आप एक के लिए देख रहे हैं सभ्य पुस्तकालय, लेकिन अगर आपको केवल कुछ मामूली आवश्यकता है, तो आप केवल एक काउंटर प्राप्त कर सकते हैं: इसे 'ऑब्जेक्ट.कीज (डेटा)। लम्बाई' पर प्रारंभ करें, और इसे '। सेव' कॉलबैक घटाएं - जब यह '0' तक पहुंच गया हो , 'some_function() 'चलाएं। – pimvdb

+0

@pimvdb जो काम करेगा (यह वही था जो मैं सोच रहा था), हालांकि यह उठने और चलाने के लिए बस एक छोटा सा हैक है, इसे करने का सही तरीका पाने के लिए किसी को कुछ पब/उप मैसेजिंग सिस्टम की आवश्यकता होगी (प्राप्त नहीं करना घटनाओं और कॉलबैक के साथ बहुत गन्दा) –

उत्तर

8

यह Async's forEach विधि है, जो एक सरणी के तत्वों पर समानांतर कार्य निष्पादित करेंगे और उसके बाद एक कॉलबैक, उदाहरण के आह्वान के लिए एक आदर्श मामला है:

async.forEach(Object.keys(data), function doStuff(x, callback) { 
    // access the value of the key with with data[x] 
    mongo.findOne({ _id:data[x]._id },function(e, post){ 
    if(post != null){ 
     post.title = 'omg updated'; 
     post.save(callback); 
    } 
    }); 
}, function(err){ 
    // if any of the saves produced an error, err would equal that error 
}); 
संबंधित मुद्दे