任务队列,添加队列超时抛出错误

/**
 * 任务队列超时机制,超时结束
 * TODO: 完成态的标准还未明确
 */
class TaskQueue {
  constructor (totalCount, timeout) {
    this._taskCount = totalCount // 当前任务总个数
    this._currentTaskNo = 0 // 当前执行的任务序号
    this._delay = timeout // 添加任务间隔的最大延迟时间
    this._timeout = null // 定时器
    this._queue = [] // 任务队列
    this._isTaskEnd = false // 此次项目是否结束,可能成功也可能超时
    this._resolve = () => { } // 完成的辅助函数
    this._reject = () => { } // 超时的辅助函数
  }
  /* eslint-disable */
  _enqueue(fn) {
    new Promise((resolve, reject) => {
      this._queue.push({ fn, resolve, reject })
    })
  }

  _dequeue() {
    if (this._queue.length) {
      const { fn, resolve, reject } = this._queue.shift()
      this._run(fn).then(resolve).catch(reject)
    }
  }

  async _run(fn) {
    const value = await fn()
    this._dequeue()
    return value
  }

  add(fn) {
    if (this._isTaskEnd) return // 如果此次任务已结束(超时/完成)则不再添加任务
    clearTimeout(this._timeout) // 清除定时器
    this._currentTaskNo++
    console.log('添加任务' + this._currentTaskNo)
    this._enqueue(fn)
    this._dequeue()
    if (this._currentTaskNo === this._taskCount) { // 如果当前的任务数量和总任务数量相等则表明此次任务结束,且是完成状态
      this._isTaskEnd = true
      return this._doComplete(true)
    }
    this._timeout = this._genTimeout()
  }

  _genTimeout() {
    const timer = setTimeout(() => {
      this._doComplete(false)
      this._isTaskEnd = true
    }, this._delay)
    return timer
  }

  _doComplete(sucess) {
    clearTimeout(this._timeout)
    this._timeout = null
    if (sucess) {
      this._resolve()
    } else {
      this._reject()
    }
  }

  start() {
    return new Promise((resolve, reject) => {
      this._resolve = resolve
      this._reject = reject
      this._timeout = this._genTimeout()
    })
  }
}

const task = new TaskQueue(3, 3000)

task.start().then(res => {
  console.log('此次任务完成')
}).catch(() => {
  console.log('此次任务超时.....失败咯')
})

setTimeout(() => {
task.add(() => {
  console.log('执行1111')
})
}, 1000)

setTimeout(() => {
  task.add(() => {
    console.log('执行2222')
  })
}, 4000)

// setTimeout(() => {
//   task.add(() => {
//     console.log('执行3333')
//   })
// }, 2500)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容