2014-07-16 9 views
13

में जेनरेटर का उपयोग करके मैं Koa.js फ्रेमवर्क और Mongoose.js मॉड्यूल का उपयोग कर रहा हूं।प्रत्येक के लिए नोड.जेएस

आम तौर पर मैं कोड इस तरह MongoDB से एक परिणाम प्राप्त करने के लिए:

var res = yield db.collection.findOne({id: 'my-id-here'}).exec(); 

लेकिन मैं 'आइटम' नामक एक सरणी के प्रत्येक तत्व के लिए इस लाइन पर अमल करने की जरूरत है।

items.forEach(function(item) { 
    var res = yield db.collection.findOne({id: item.id}).exec(); 
    console.log(res) // undefined 
}); 

लेकिन यह कोड नहीं चलता है क्योंकि उपज फ़ंक्शन में होती है। अगर मैं इसे लिखता हूं:

items.forEach(function *(item) { 
    var res = yield db.collection.findOne({id: item.id}).exec(); 
    console.log(res) // undefined 
}); 

मुझे परिणाम फिर से परिवर्तनीय में नहीं मिल रहा है। मैंने 'generator-foreach' मॉड्यूल का उपयोग करने की कोशिश की लेकिन यह इस तरह काम नहीं किया।

मुझे पता है कि यह नोड.जे.एस. की भाषा साक्षरता के बारे में ज्ञान की कमी है। लेकिन क्या आप लोग इसे कैसे करने के तरीके खोजने में मेरी मदद कर सकते हैं?

+0

आपने 'जनरेटर-फोरैच' के साथ वास्तव में क्या प्रयास किया? – loganfsmyth

+0

मैंने जनरेटर-फोरैच के साथ बस के लिए प्रतिस्थापित किया। शेष कोड एक ही है। क्या आप अपना कोड स्निपेट संशोधित कर सकते हैं और यह सुनिश्चित कर सकते हैं कि यह काम कर रहा है? –

उत्तर

4

धन्यवाद दोस्तों, मैंने इसे 'CO' मॉड्यूल का उपयोग करके किया है। धन्यवाद।

var co = require('co'); 

items.forEach(co(function* (item) { 
    var img = yield db.collection.findOne({id: item.id}).exec(); 
})); 

संपादित करें: सीओ के नवीनतम संस्करण के साथ, आपको काम करने के लिए co.wrap() की आवश्यकता है।

+0

यह काम नहीं करता है क्योंकि 'item' === 'आइटम्स' जब यह सह() –

+0

के साथ लपेटा जाता है तो, आपने इसे कैसे हल किया? –

+4

यदि आप लूप के लिए मानक (x = 0; x

18

आप yield सरणियों, तो बस अपने async वादों एक और नक्शा

var fetchedItems = yield items.map((item) => { 
    return db.collection.findOne({id: item.id}); 
}); 
+1

के बजाय लूप का उपयोग करने की आवश्यकता है, यह बहुत आसान है और स्वीकार्य उत्तर होना चाहिए। –

7

स्वीकार किए जाते हैं जवाब गलत है में मैप कर सकते हैं, वहाँ एक पुस्तकालय का उपयोग करने की कोई जरूरत एक सरणी पहले से ही एक iterable है,।

यह एक पुरानी सवाल है, लेकिन चूंकि यह अभी तक कोई सही जवाब है और यह मुख्य शब्द "iterators और foreach के लिए" गूगल खोज पर प्रथम पृष्ठ पर दिखाई देता है मैं सवाल का जवाब देंगे:

कोई है एक सरणी पर पुनरावृत्त करने की आवश्यकता है, क्योंकि एक सरणी पहले से ही पुनरावर्तनीय एपीआई के अनुरूप है।

अपने जनरेटर के अंदर सिर्फ "उपज * सरणी" (ध्यान दें *) का उपयोग उपज * अभिव्यक्ति एक और जनरेटर या iterable वस्तु को सौंपने के लिए प्रयोग किया जाता है

उदाहरण:

let arr = [2, 3, 4]; 

    function* g2() { 
     yield 1; 
     yield* arr; 
     yield 5; 
    } 

    var iterator = g2(); 

    console.log(iterator.next()); // { value: 1, done: false } 
    console.log(iterator.next()); // { value: 2, done: false } 
    console.log(iterator.next()); // { value: 3, done: false } 
    console.log(iterator.next()); // { value: 4, done: false } 
    console.log(iterator.next()); // { value: 5, done: false } 
    console.log(iterator.next()); // { value: undefined, done: true } 

उदाहरणों के लिए और में गहराई की जानकारी पर जाएं: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/yield *