并发控制
并发控制 function timeout(timer) { return new Promise((res) => setTimeout(res, timer)); } class SuperTask { constructor(parallelCount = 2) { this.parallelCount = parallelCount; //并发数 this.tasks = []; //还在排队的任务 this.runningCount = 0; //正在执行的任务数 } add(task) { return new Promise((resolve, reject) => { this.tasks.push({ task, resolve, reject, }); this._run(); }); } _run() { while (this.runningCount < this.parallelCount && this.tasks.length) { const { task, resolve, reject } = this.tasks.shift(); //取出第一个任务 task() .then(resolve, reject) .finally(() => { //不管成功失败都会去再次尝试执行任务 this.runningCount--; this._run(); }); this.runningCount++; } } } const superTask = new SuperTask(); function addTask(time, name) { superTask .add(() => timeout(time)) .then(() => { console.log(`任务${name}完成`); }); } addTask(10000, 1); //10000ms后输出 任务1完成 addTask(5000, 2); // 5000ms后输出 任务2完成 addTask(3000, 3); // 8000ms后输出 任务3完成 addTask(4000, 4); // 12000ms后输出 任务4完成 addTask(5000, 5); // 15000ms后输出 任务5完成