const limitPromise = (promiseFnList, limit) => {
return new Promise(reslove => {
let activeIndex = 0; // limit个promise,当前执行到的个数
const listLength = promiseFnList.length;
let sum = 0; // 表示promiseFnList进入then的次数,用于统计返回的结果数
let index = -1; // 当前执行的promise在promiseFnList中的索引
let result = []; // 按顺序存储所有promise的返回结果
for (let i = 0; i < limit; i++) {
run();
}
function run() {
if (promiseFnList.length && activeIndex < limit) {
activeIndex++;
const p = promiseFnList.shift();
index++;
((index, p) => {
Promise.resolve(p()).then(res => {
sum++;
activeIndex--;
result[index] = res;
if (sum === listLength) {
reslove(result);
}
run();
});
})(index, p);
}
}
});
};
const promiseProducer = (time, response) => {
return function () {
return new Promise(resolve => {
setTimeout(() => {
resolve(response);
}, time);
});
}
};
const promiseList = [
promiseProducer(100, 1),
promiseProducer(500, 5),
promiseProducer(200, 2),
promiseProducer(1000, 10),
promiseProducer(300, 3),
];
limitPromise(promiseList, 2).then(res => {
console.log(res); //[ 1, 5, 2, 10, 3 ]
});
控制promise并行执行的个数
最新推荐文章于 2022-10-17 11:45:36 发布