请求并行控制器

125 阅读1分钟

实现一个只能并行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');
});