提米,异步线程池
要求 例如给定一个异步线程池要求同时有2个请求
例如5个请求 1为1秒 2为2秒以此类推 输出结果为 第一个是1秒后获取数据 第二个是2秒后获取数据 第三个为4秒后获取数据 1+3 第四个为6秒后获取数据 2+4 第五个为9秒后获取数据 4+5 思路代码
//模拟为请求
function promiseAxios(daly: number, data: string) {
console.time(data);
return () =>
new Promise((resolve, reject) => {
setTimeout(() => {
resolve(data);
console.timeEnd(data);
}, daly);
});
}
type promiseFn = () => Promise<unknown>;
//创建一个对象
class Theard {
constructor(maxNum: number) {
this.maxNum = maxNum;
}
private executeQueue: promiseFn[] = []; //执行队列
private maxNum = 0; //同时的请求数量
private isStart = false; //当前是否启动
addTask(cb: promiseFn) {
//往里面添加请求函数
this.executeQueue.push(cb);
}
runTask() {
//运行 第一次为设定的最大请求数 后续等每一个异步任务执行完毕递归调用该方法执行,但次数设为1
for (let i = 0; i < this.maxNum; i++) {
const fn = this.executeQueue.shift();
if (fn) {
fn().then((res) => {
console.log(res);
this.maxNum = 1;
this.runTask();
});
}
}
}
start() {
this.runTask();
this.isStart = true;
}
}
const theard = new Theard(2);
theard.addTask(promiseAxios(1000, "商品1")); //商品1: 1007ms
theard.addTask(promiseAxios(2000, "商品2"));//商品2: 2003ms
theard.addTask(promiseAxios(3000, "商品3"));//商品3: 4009ms
theard.addTask(promiseAxios(4000, "商品4"));//商品4: 6005ms
theard.addTask(promiseAxios(5000, "商品5"));//商品5: 9011ms
theard.start();