我正在使用Promise.map处理数组。对于每个元素,我正在执行一个返回promise的异步操作。但是,我想在每次调用之间引入一些延迟,因为下游对请求数量有限制。这就是我想要做的事情
return Promise.map(array, function (elem){
// perform an async call using elem
// wait for 500 ms
})
我怎样才能达到同样的目标?
答案 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);
})
希望这些信息对您有所帮助。