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

时间:2016-03-08 08:20:37

标签: node.js bluebird

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

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

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

3 个答案:

答案 0 :(得分:4)

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

您需要设置concurrency option

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

答案 1 :(得分:3)

  

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

此类问题的解决方案是限制您所做的同时请求的数量。使用延迟只是猜测如何控制,但根本不准确。相反,您应该在字面上限制同时在飞行中的请求数量。

  

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

幸运的是,Bluebird有一个并发选项,通过设置Promise.map()选项,可以使用concurrency方法同时控制有多少请求在同一时间。我们假设您发现同时有两个飞行请求是安全的。然后,你可以这样做:

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

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

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

答案 2 :(得分:0)

假设您正在添加任何功能,例如添加内部地图功能

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); 
})

希望这些信息对您有所帮助。