2014-07-14 18 views
13

के लिए ब्लूबर्ड कॉन्सुरेंसी विकल्प का उपयोग कैसे करें मैं अंतर्निहित समवर्ती नियंत्रण के साथ ब्लूबर्ड के मानचित्र फ़ंक्शन का उपयोग करने का प्रयास कर रहा हूं।मानचित्र फ़ंक्शन

मैं नामों की एक सूची पुनर्प्राप्त करना चाहता हूं, फिर प्रत्येक नाम के लिए कई POST अनुरोध करें। उदाहरण के लिए, मैं सप्ताह के प्रत्येक दिन के लिए प्रत्येक नाम के लिए अनुरोध करना चाहता हूं। हालांकि, मुझे समवर्ती POST अनुरोधों की संख्या को थ्रॉटल करने की आवश्यकता है क्योंकि इच्छित सर्वर की दर सीमा है।

function getNames() { 
    //Open mongodb connection 
    //Get collection and array of names 
    //return array of names in a promise 
} 

function createDatesArray() { 
    //Create an array of rates 
    //return array of dates in a promise 
    //Ex. return Promise.resolve(datesArray); 
} 

getNames().map(function (name) { 
    return createDatesArray().map(function (date) { 
     return requestData(date, name); 
    }, {concurrency: 5}); 
}).then(function() { 
//do something 
}); 

क्या यह ब्लूबर्ड की समरूपता का उपयोग करने का सही तरीका है?

प्रलेखन लिंक यहां bluebird documentation है।

उत्तर

13

लघु जवाब: हाँ, इस अनुरोध की संख्या 5 पर

चेतावनी तक सीमित कर देगा: ध्यान में रखना तुम अब भी जैसे HTTP ग्राहक की, या किसी अन्य पूल के रूप में अधिक सीमा, के लिए अतिसंवेदनशील हो सकता है, मॉड्यूल और सेवाओं का उपयोग आप कर सकते हैं।

इसके अलावा, एक मोंगो कनेक्शन का उपयोग लगातार एक के रूप में किया जाना चाहिए, इसलिए आपको शायद केवल एक खोलना चाहिए और फिर इसे हर बार खोलने और बंद करने के बजाय इसका उपयोग करना चाहिए।

createDatesArray कुछ भी अतुल्यकालिक ऐसा नहीं करता है, तो आप आप के बजाय Promise.map(datesArray, function(date){ ... }) आदि मैं करूंगा भी घोंसला नहीं के रूप में map के स्थिर संस्करण का उपयोग कर सकते यह Promise.resolve की जरूरत नहीं है,। मान लीजिए createDatesArray वास्तव में async है:

Promise.join(getNames(), createDatesArray(), function(names, dates){ 
    var tasks = []; 
    names.forEach(function(name){ // create Cartesian product of names * dates 
     dates.forEach(function(date){ 
      tasks.push(function(){ return requestData(name, date); }); 
     }); 
    }); 
    return Promise.map(tasks, function(job){ return job(); } , { concurrency: 5}); 
}), then(function(results){ 
    // do whatever 
}); 
+0

मीठे। मैं अन्य जगहों पर मोन्गो कनेक्शन पर वादा कर रहा था। मुझे नहीं पता था कि मानचित्र के स्थिर संस्करण ने समवर्ती विकल्प भी लिया था। आपका कोड उदाहरण एक बहुत ही पठनीय दृष्टिकोण है। स्व। – aefhm

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