实现一个只能并行n个请求的控制器,请求完成后返回对应的结果
class RequestControler {
constructor(num) {
this.num = num;
}
parallelSendRequest(requestList) {
this.requestList = requestList;
this.resultList = [];
this.count = 0;
this.i = -1;
return new Promise((resolve) => {
while (this.i < this.num - 1 && this.i < this.requestList.length) {
this.sendRequest(++this.i, resolve);
}
});
}
sendRequest(i, resolve) {
if (this.requestList.length > i) {
this.requestList[i]().then(
(res) => {
this.resultList[i] = res;
this.count++;
if (this.requestList.length === this.count) {
resolve(this.resultList);
}
this.sendRequest(++this.i, resolve);
},
(rej) => {
this.resultList[i] = rej;
this.count++;
if (this.requestList.length === this.count) {
resolve(this.resultList);
}
this.sendRequest(++this.i);
},
);
}
}
}
const controler = new RequestControler(5);
const requestList = [];
for (let i = 0; i < 10; i++) {
requestList.push(
() =>
new Promise((resolve, reject) => {
setTimeout(() => {
resolve(10 - i);
}, i * 1000);
}),
);
}
controler.parallelSendRequest(requestList).then((res) => {
console.log(res, 'res');
});