【发布时间】:2021-04-24 20:01:35
【问题描述】:
我正在尝试创建一个函数,该函数将获得一个承诺数组并将它们分块执行。
这里我有一个我写的函数的例子,它应该已经完成了我想要的。 但是发生的事情是所有的承诺都已经在第一个 promise.all 之后执行了。 nodeJS 调试器显示它按我希望的那样工作。但我可以在 whireshark 中看到所有请求都是在第一个块之后发送的。
const reqs = [...Array(10)].map(() => () => axios.post('http://localhost:7000/test', {}))
const handleChunks = (reqs) => {
const chunks = []
const chunkSize = 5
for (let i = 0; i < reqs.length; i += chunkSize) {
chunks.push(reqs.slice(i, i + chunkSize))
}
chunks.reduce(async (acc, chunk) => {
const chunkToPromise = chunk.map((chunkFunc) => chunkFunc())
return Promise.all(chunkToPromise).then(async (result) => {
acc = await acc
acc.push(result)
return acc
})
}, Promise.resolve([]))
}
在我看来,我创建的所有 Promise 都已经在任务队列中声明了自己,并且 Promise.all 并没有真正接受你给他的东西,而是任务队列中的所有承诺
有没有人知道如何处理这种问题?
编辑:我发现在客户端上的工作方式相同......
【问题讨论】:
-
您对问题的描述与您发布的代码非常不同,这使得它很难理解。特别是,您的数组切片是否按照您预期的方式工作,或者您希望通过分块来完成的工作(不是向服务器发送一堆请求?),这一点都不清楚。 “任务队列”是什么意思,因为我没有看到你,例如从堆栈中弹出任何东西?
-
我能解释的最好的问题是您想向服务器发出
n请求,但希望一次运行它们不超过k请求,等待当前的一组k请求在继续下一个之前完成。对吗? -
是的,Jared 你是对的.. 抱歉,如果我不够清楚。
标签: javascript node.js promise async-await chunks