本文介绍了在Javascript中与缓冲池大小同时执行promises的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个带有promise的函数,每次都必须使用不同的params执行n次。我希望链接承诺的方式是脚本当时总是处理3-4个承诺。
I have a function with a promises which must be executed n times with different params each time. I want to chain the promises in a way that the script is always working on 3-4 promises at the time.
我用promise.all制作它,执行3同时并且当所有承诺结算时,它继续下一个3。
I made it with promise.all, this executes 3 concurrently and when all the promises resolves it goes on with the next 3.
如何使其工作,当3中的一个解决时,它立即开始与另一个但始终在工作当时最多3个?
How to make it work that when one of 3 resolves it starts immediatly with another but always working on max 3 at the time?
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]),
]);
}
}
推荐答案
使用,您可以轻松实现这一目标:
You can achieve this fairly easy using es6-promise-pool:
const tasks = [
(param) => new Promise(function(resolve, reject) {
setTimeout(resolve, 2000, 'foo');
}),
() => new Promise(function(resolve, reject) {
setTimeout(resolve, 2000, 'foo');
}),
() => new Promise(function(resolve, reject) {
setTimeout(resolve, 2000, 'foo');
}),
() => Promise.resolve(1),
() => Promise.resolve(2),
() => Promise.resolve(3)
];
let count = 1;
const promiseProducer = () => {
while(tasks.length) {
console.log('processing ' + count++);
const task = tasks.shift();
return task(); // optionally you could pass a parameter here
}
return null;
}
const pool = new PromisePool(promiseProducer, 3); // concurrent Promises set to 3
const poolPromise = pool.start();
poolPromise.then(() => { console.log('done!'); })
<script src="https://cdn.jsdelivr.net/npm/[email protected]/es6-promise-pool.min.js"></script>
这篇关于在Javascript中与缓冲池大小同时执行promises的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!