并发任务控制

133 阅读1分钟

某些场景会有很多并发需求,比如用户的上传、富文本编辑、下载等场景。但是过多的任务会导致页面性能下降甚至卡死,所以需要对任务的并发量限制在一定范围内,有序可控,提高页面稳定性。

以下以Promise任务为例,控制运行任务:

class limitPromise {
  constructor(max) {
    this.max = max || 2;
    this.task_queue = [];
  }
  add(task) {
    this.task_queue.push(task);
  }

  run() {
    if (!this.task_queue.length) return;
    let min = Math.min(this.task_queue.length, this.max);
    for (let i = 0; i < min; i++) {
      this.max--;
      let task = this.task_queue.shift();
      task()
        .then((res) => {
          console.log(res);
        })
        .finally(() => {
          this.max++;
          this.run();
        });
    }
  }

  addTask(result, time) {
    let task = () =>
      new Promise((res, rej) => {
        setTimeout(() => {
          res(result);
        }, time * 1000);
      });
    this.add(task);
  }
}

let taskHandle = new limitPromise(3);

taskHandle.addTask(1, 1);
taskHandle.addTask(3, 8);
taskHandle.addTask(7, 3);
taskHandle.addTask(5, 4);
taskHandle.addTask(6, 5);
taskHandle.run();