/**
* 任务队列超时机制,超时结束
* 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辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
相关阅读更多精彩内容
- 1、JS是单线程语言,包括同步任务、异步任务,异步任务又包括宏观任务和微观任务 2、执行顺序:同步任务——>微观任...
- 方法类型抛出异常特殊值阻塞超时插入add(e)offer(e)put(e)offer(e,time,unit)移除...
- 在和同事介绍celery时 同事说了一句“这不就是kafka吗?”。 那么YTask和nsq,celery和ka...
- Eventloop 要说Eventloop,就不得不提浏览器进程和JavaScript单线程的三两事。 浏览器的工...
- 参考:Yarn 资源调度策略hadoop的三种任务调度的原理 1 Yarn 资源调度策略 1)队列调度:FIFO ...