实现有并行限制的Promise调度器

296 阅读1分钟

// addTask(1000,'1') // addTask(500,'2') // addTask(300,'3') // addTask(400,'4') // 输出顺序是:2 3 1 4

// 整个的完整执行流程:

// 一开始1、2两个任务开始执行 // 500ms时,2任务执行完毕,输出2,任务3开始执行 // 800ms时,3任务执行完毕,输出3,任务4开始执行 // 1000ms时,1任务执行完毕,输出1,此时只剩下4任务在执行 // 1200ms时,4任务执行完毕,输出4

class Scheduler {
  constructor(limit) {
    this.queue = []
    this.maxCount = limit
    this.runCounts = 0
  }
  add(time, order) {
    const promiseCreator = () => {
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          console.log(order)
          resolve()
        }, time)
      })
    }
    this.queue.push(promiseCreator)
  }
  taskStart() {
    for (let i = 0; i < this.maxCount; i++) {
      this.request()
    }
  }
  request() {
    if (!this.queue || !this.queue.length || this.runCounts >= this.maxCount) {
      return
    }
    this.runCounts++
    this.queue.shift()().then(() => {
      this.runCounts--
      this.request()
    })
  }
}
const scheduler = new Scheduler(2)
const addTask = (time, order) => {
  scheduler.add(time, order)
}
addTask(1000, '1')
addTask(500, '2')
addTask(300, '3')
addTask(400, '4')
scheduler.taskStart()