Bluebird.js:如何添加等待Promise.map的每次迭代?

我正在使用Promise.map处理数组。 对于每个元素,我执行一个asynchronous操作,返回一个promise。 不过,我想在每个呼叫之间引入一些延迟,因为下游对请求数量有限制。 这是我想要做的

return Promise.map(array, function (elem){ // perform an async call using elem // wait for 500 ms }) 

我怎样才能达到相同的?

因为下游对请求数量有限制

这种types的问题的解决scheme是限制您所做的同时请求的数量。 使用延迟只是猜测如何控制,而不是精确的。 相反,你应该从字面上限制同时在飞行中的请求数量。

我怎样才能达到相同的?

幸运的是,Bluebird有一个并发选项,通过设置并发选项来控制Promise.map()方法在同一时间内有多less个请求正在进行。 假设您发现同时有两个请求在飞行中是安全的。 那么,你可以这样做:

 return Promise.map(array, function (elem){ // perform an async call, return a promise from that async call }, {concurrency: 2}); 

这将pipe理通过数组的迭代,以便同时运行不超过2个asynchronous操作。 你显然可以将concurrency设置为你认为合适的值。

Promise.mapSeries()方法是Promise.mapSeries()的一个特例, concurrency已经设置为1.所以,如果你真的希望这些调用是连续的(在任何给定的时间只有一个在飞行中),那么你可以直接使用Promise.mapSeries()方法。

延迟不会有帮助,因为arrays的所有项目都将同时处理(或开始处理)。

您需要设置concurrency选项

 return Promise.map(array, function (elem){ // perform an async call using elem // wait for 500 ms }, {concurrency: 1}) 

比方说,你正在添加任何像添加地图function的function

 function add(value) { return new Promise(function (resolve) { // some operations resolve(value + 1); }).then(function (newValue) { return // result; }); } 

你可以通过添加.dealy()来延迟它。

例如

 return Promise.map(array, function (elem){ // perform an async call using elem // wait for 500 ms return add(1).delay(500); }) 

希望这些信息对你有帮助。