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

Man*_*ngh 5 node.js bluebird

我正在使用Promise.map处理数组。对于每个元素,我正在执行一个异步操作,该操作返回一个Promise。但是,我想在每次调用之间引入一些延迟,因为下游对请求数量有限制。这是我想做的

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

我怎样才能达到同样的目的?

jfr*_*d00 6

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

此类问题的解决方案是限制同时发出的请求的数量。使用延迟只是对如何控制它的猜测,但一点也不精确。相反,您应该严格限制同时处理的请求数量。

我怎样才能达到同样的效果?

Promise.map()幸运的是,Bluebird 有一个并发选项,可以通过设置选项来控制同时处理的请求数量concurrency。假设您发现同时处理两个请求是安全的。然后,你可以这样做:

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

这将管理数组的迭代,以便同时进行的异步操作不超过 2 个。显然,您可以设置concurrency为您认为合适的任何值。

该方法是with已设置为 1Promise.mapSeries()的一种特殊情况。因此,如果您确实希望调用是连续的(在任何给定时间只有一个正在进行中),那么您可以直接使用该方法。Promise.map()concurrencyPromise.mapSeries()