问题:
function Queue(){
}
实现队列Queue的两个方法:
add(timeout, callback) -- 给队列中添加方法
start() -- 执行队列中的方法,执行完之后队列清空
实现链式调用
例如:
var que = new Queue()
que.add(1000, function(){
console.log("1")
}).add(2000, function(){
console.log("2")
}).add(1000, function(){
console.log("3")
}).start()
// 输出1 2 3 时间间隔为1s 2s 1s
解法:
利用while循环来延时
Queue.prototype.add = function(time, func){
this.arr.push((function(){
let now = Date.now()
while(Date.time - now <= time){}
func()
}))
return this
}
Queue.prototype.start = function(){
// 遍历数组,一次执行
this.arr.map((ele) => {
ele()
})
this.arr = []
return this
}
借助promise的链式调用
class Queue {
constructor() {
this.queue = []
}
add(timeout, callback) {
this.queue.push({
timeout,
callback
})
return this
}
// promise方法
start() {
// Promise 链式调用
var promise = new Promise((resolve)=>{
resolve()
})
for(let i=0;i<this.queue.length;i++){ // 注意作用域内 存在异步任务变量的let
let {timeout, callback} = this.queue[i]
promise = promise.then(()=>{
return new Promise((resolve)=>{
setTimeout(()=>{
callback()
resolve()
}, timeout)
})
})
}
this.queue = null
}
}
async/await
class Queue {
constructor() {
this.queue = []
}
add(timeout, callback) {
this.queue.push({
timeout,
callback
})
return this
}
// async/await方法
async start() {
for(let i=0;i<this.queue.length;i++){
let {timeout, callback} = this.queue[i]
await new Promise((resolve)=>{
setTimeout(()=>{
callback()
resolve()
},timeout)
})
}
}
}
延时问题的链式调用
最新推荐文章于 2022-01-16 19:46:17 发布