我有一个带有promises的函数,它必须执行n次,每次都使用不同的参数。我希望将promises链接起来,使脚本每次总是处理3-4个promises。
我用promise,all,这个同时执行3,当所有的promise都解决了,它继续下一个3。
如何使它的工作,当其中一个3解决它立即开始与另一个,但总是工作在最大3的时间?
for( var i = 0; i < tasks.length; i++){
if( i > 0 && i%3 == 0 ){
await Promise.all([
doTaskFunction(tasks[i]),
doTaskFunction(tasks[i-1]),
doTaskFunction(tasks[i-2]),
]);
}
}
4条答案
按热度按时间lp0sw83n1#
使用es6-promise-pool可以相当容易地实现这一点:
a9wyjsp72#
我只是把我对生成器实现的天真留在这里!:)
fnatzsnv3#
如果您不想使用任何插件/依赖项,您可以使用此解决方案。
假设您的数据位于名为
datas
的数组中1.创建一个函数来处理
datas
数组中的数据,我们将其命名为processData()
1.创建一个函数,该函数将在while循环中一个接一个地执行
processData()
,直到datas
数组中没有数据为止,我们调用该函数bufferedExecution()
。1.创建大小为
buffer_size
的数组1.用
bufferedExecution()
填充数组1.并等待它在
Promise.all()
或Promise.allSettled()
中解析这里是一个工作示例,其中数据是数字和操作等待一段时间,并返回数字的平方,它也随机拒绝.
产出
s3fp2yjn4#
它可以用递归来解决。
其思想是,最初我们立即运行最大允许数量的任务,并且这些任务中的每一个都应该在其完成时递归地启动一个新任务。
在本例中,我将成功的响应与错误一起填充,并执行所有请求,但如果您希望在第一次失败时终止批处理执行,则可以稍微修改算法。