看到的一道面试题后思考手写记录

56 阅读1分钟

提米,异步线程池

要求 例如给定一个异步线程池要求同时有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();