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); })
希望这些信息对你有帮助。