js 并发任务控制
class SuperTask { constructor(parallelCount = 2) { this.parallelCount = parallelCount this.tasks = [] this.ruuingCount = 1 } add(task1) { return new Promise((resolve, reject) => { this.tasks.push({ task1, resolve, reject }) this._run() }) } _run() { while ((this.ruuingCount < this.parallelCount) && this.tasks.length) { let { task1, resolve, reject } = this.tasks.shift() this.ruuingCount++ Promise.resolve(task1()).then(resolve, reject).finally(() => { this.ruuingCount--; this._run() } ) } } } function timeout(time) { return new Promise((resolve) => { setTimeout(() => { resolve() }, time) }) } const superTask = new SuperTask() function addTask(time, name) { superTask.add(() => timeout(time)).then(() => { console.log('task ' + name + ' finish') }) } addTask(1000, 1) addTask(1000, 2) addTask(1000, 3) addTask(1000, 4)