Promise 如何使用bluebirdJS承诺成批发出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个请求开始

我有1000个http API请求要发出。我把它们都当作一系列承诺来履行。我希望一次执行100个批次,不超过100个,以避免达到任何API速率限制/限制等

虽然为
.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
以串行方式运行批处理,但以并行方式在批处理中运行异步操作<代码>蓝鸟地图系列()。。。我不明白如何使用它来运行批处理,它只能在批处理中运行异步操作,并且只能在系列中运行。