使用ES6的Promise.all()时限制并发的最佳方法是什么?

我有一些代码遍历从数据库中查询出来的列表,并对该列表中的每个元素进行HTTP请求。该列表有时可能是一个相当大的数目(成千上万个),并且我想确保我不会遇到具有成千上万个并发HTTP请求的Web服务器。

该代码的缩写版本目前看起来像这样…

function getCounts() {

return users.map(user => {

return new Promise(resolve => {

remoteServer.getCount(user) // makes an HTTP request

.then(() => {

/* snip */

resolve();

});

});

});

}

Promise.all(getCounts()).then(() => { /* snip */});

该代码在节点4.3.2上运行。重申Promise.all一下,是否可以进行管理,以便在任何给定时间仅进行一定数量的承诺?

回答:

请注意Promise.all(),创建诺言本身不会触发诺言开始工作。

考虑到这一点,一种解决方案是检查承诺何时得到解决,是否应该启动新的承诺,或者您是否已经达到极限。

但是,实际上没有必要在这里重新发明轮子。您可以用于此目的的一个库是es6-promise-

pool。从他们的例子:

// On the Web, leave out this line and use the script tag above instead. 

var PromisePool = require('es6-promise-pool')

var promiseProducer = function () {

// Your code goes here.

// If there is work left to be done, return the next work item as a promise.

// Otherwise, return null to indicate that all promises have been created.

// Scroll down for an example.

}

// The number of promises to process simultaneously.

var concurrency = 3

// Create a pool.

var pool = new PromisePool(promiseProducer, concurrency)

// Start the pool.

var poolPromise = pool.start()

// Wait for the pool to settle.

poolPromise.then(function () {

console.log('All promises fulfilled')

}, function (error) {

console.log('Some promise rejected: ' + error.message)

})

以上是 使用ES6的Promise.all()时限制并发的最佳方法是什么? 的全部内容, 来源链接: utcz.com/qa/421812.html

回到顶部