我有一些代码迭代从数据库中查询出的列表,并为该列表中的每个元素发出 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 */});
此代码在 Node 4.3.2 上运行。重申一下,能否对 Promise.all
进行管理,以便在任何给定时间只有一定数量的承诺在进行中?
原文由 Chris 发布,翻译遵循 CC BY-SA 4.0 许可协议
请注意,
Promise.all()
不会触发开始工作的承诺,而是创建承诺本身。考虑到这一点,一种解决方案是在承诺解决时检查是否应该开始新的承诺,或者您是否已经达到极限。
不过,这里真的没有必要重新发明轮子。 您可以为此目的使用的一个库是
es6-promise-pool
。从他们的例子: