aef*_*fhm 14 concurrency promise bluebird
我试图使用bluebird的map函数和内置的并发控制.
我想检索一个名称列表,然后为每个名称发出一些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
});
Run Code Online (Sandbox Code Playgroud)
这是使用bluebird并发的正确方法吗?
文档链接在这里是bluebird文档.
Ben*_*aum 15
简答:是的,这会将请求数限制为5.
警告:请记住,您可能仍然容易受到更多限制,例如HTTP客户端或您可能正在使用的任何其他池,模块和服务.
此外,Mongo连接应该用作持久连接,因此您应该只打开一个然后使用它而不是每次都打开和关闭它.
如果createDatesArray没有异步做任何事情,你没有Promise.resolve它,你可以改为使用mapas Promise.map(datesArray, function(date){ ... })等的静态变量.我也不会嵌套.假设createDatesArray确实是异步的:
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
});
Run Code Online (Sandbox Code Playgroud)