Promise 如何使用bluebirdJS承诺成批发出API请求,而不仅仅是受并发性的限制
我有1000个http API请求要发出。我把它们都当作一系列承诺来履行。我希望一次执行100个批次,不超过100个,以避免达到任何API速率限制/限制等 虽然为Promise 如何使用bluebirdJS承诺成批发出API请求,而不仅仅是受并发性的限制,promise,batch-processing,bluebird,throttling,rate-limiting,Promise,Batch Processing,Bluebird,Throttling,Rate Limiting,我有1000个http API请求要发出。我把它们都当作一系列承诺来履行。我希望一次执行100个批次,不超过100个,以避免达到任何API速率限制/限制等 虽然为.map()函数提供了并发性选项,但它限制了每次调用的次数。这意味着它将确保一次处理的并发请求不超过100个—第一个请求解析后,它将开始处理第101个请求—它不会等到所有100个请求都解析后再开始处理下一个100个请求 我正在寻找的“批处理”行为是首先处理100个请求,只有在所有的100个请求都完成之后,才应该从接下来的100个请求开始
.map()
函数提供了并发性
选项,但它限制了每次调用的次数。这意味着它将确保一次处理的并发请求不超过100个—第一个请求解析后,它将开始处理第101个请求—它不会等到所有100个请求都解析后再开始处理下一个100个请求
我正在寻找的“批处理”行为是首先处理100个请求,只有在所有的100个请求都完成之后,才应该从接下来的100个请求开始
BlueBirdJS是否提供任何现成的API来以这种方式处理批处理?您可以将大的
URL
数组拆分为批处理数组。对于每个批处理运行Promise#map
,将在所有异步操作完成后解决。并使用Array#reduce
按顺序运行这些批处理
let readBatch(urls) {
return Promise.map(url => request(url));
}
let read(urlBatches) {
return urlBatches.reduce((p, urls) => {
return p.then(() => readBatch(urls));
}, Promise.resolve());
}
const BATCH_SIZE = 100;
let urlBatches = [];
for (let i = 0; i < urls.length; i+= BATCH_SIZE) {
let batch = array.slice(i, i + BATCH_SIZE);
urlBatches.push(batch);
}
read(urlBatches)
.then(() => { ... }) // will be called when all 1000 urls are processed
let readBatch(URL){
返回Promise.map(url=>request(url));
}
让我们读(URL批处理){
返回urlbacks.reduce((p,url)=>{
返回p.then(()=>readBatch(URL));
},Promise.resolve());
}
常量批次大小=100;
设urlbacks=[];
for(设i=0;i{…})//将在处理所有1000个URL时调用
您可以将大的URL
数组拆分为批处理数组。对于每个批处理运行Promise#map
,将在所有异步操作完成后解决。并使用Array#reduce
按顺序运行这些批处理
let readBatch(urls) {
return Promise.map(url => request(url));
}
let read(urlBatches) {
return urlBatches.reduce((p, urls) => {
return p.then(() => readBatch(urls));
}, Promise.resolve());
}
const BATCH_SIZE = 100;
let urlBatches = [];
for (let i = 0; i < urls.length; i+= BATCH_SIZE) {
let batch = array.slice(i, i + BATCH_SIZE);
urlBatches.push(batch);
}
read(urlBatches)
.then(() => { ... }) // will be called when all 1000 urls are processed
let readBatch(URL){
返回Promise.map(url=>request(url));
}
让我们读(URL批处理){
返回urlbacks.reduce((p,url)=>{
返回p.then(()=>readBatch(URL));
},Promise.resolve());
}
常量批次大小=100;
设urlbacks=[];
for(设i=0;i{…})//将在处理所有1000个URL时调用
不会在100个项目的列表中破坏请求并应用承诺。所有都在承诺中。每个都做?不会在100个项目的列表中破坏请求并应用承诺。所有都在承诺中。每个都做?很好。。。。我使用了.mapSeries()
而不是.reduce
来运行系列中的批处理。。。。使用.mapSeries()
时,代码比较干净。在您的问题中,您询问了运行新批处理的解决方案,只有在所有100个请求都完成之后,Bluebird#mapSeries
才能以不同的方式工作。它以串联方式运行操作,而不是并行运行。但这正是我们试图做的,对吗?要以系列/顺序一批接一批地运行—因此Bluebird#mapSeries()
的操作与您引用的文档完全相同。然而,批处理中的承诺可以并行发生不,这是不同的Array#reduce
以串行方式运行批处理,但以并行方式在批处理中运行异步操作<代码>蓝鸟地图系列()。。。我不明白如何使用它来运行批处理,它只能在批处理中运行异步操作,并且只能在系列中运行。很好。。。。我使用了.mapSeries()
而不是.reduce
来运行系列中的批处理。。。。使用.mapSeries()
时,代码比较干净。在您的问题中,您询问了运行新批处理的解决方案,只有在所有100个请求都完成之后,Bluebird#mapSeries
才能以不同的方式工作。它以串联方式运行操作,而不是并行运行。但这正是我们试图做的,对吗?要以系列/顺序一批接一批地运行—因此Bluebird#mapSeries()
的操作与您引用的文档完全相同。然而,批处理中的承诺可以并行发生不,这是不同的Array#reduce
以串行方式运行批处理,但以并行方式在批处理中运行异步操作<代码>蓝鸟地图系列()。。。我不明白如何使用它来运行批处理,它只能在批处理中运行异步操作,并且只能在系列中运行。