接口轮询构造器
这里实现了基础的接口轮询构造器,如果有更复杂的轮询需求可以自行添加逻辑。
不用setInterval的原因是,它的执行机制是只负责每隔一段时间往任务队列(这块有兴趣的可以了解一下event loop,任务队列和执行栈的工作方式)添加执行函数,不管函数结果如何,不管上一个执行函数是否执行,很大程度上不满足业务需求。
用setTimeout可以和promise配合,严格控制执行顺序,实现思路参考了ahooks里的轮询钩子函数
// 构造器
class proll{
constructor(delayTime){
// 延时时间
this.delayTime = delayTime
// 轮询结束标志
this.flag = true
}
// 轮询结束方法,用箭头函数的目的是让this指向实例,不需要用apply或者call改变this指向
cancel = ()=>{
this.flag = false
}
// 延时函数
timeoutPromise = ()=>{
return new Promise(resolve => {
setTimeout(resolve,this.delayTime)
})
}
// 轮询开始函数
async start(func){
// 循环
while(this.flag){
try{
// 执行函数
await func()
}catch(err){
// 错误处理
console.warn('err');
}finally{
// 延时
await this.timeoutPromise()
}
}
}
}
// 使用demo
// 执行函数
function func (){
return new Promise((resolve) => {
console.log(2222)
setTimeout(resolve,50)
})
}
// 创建实例
let prollFunc = new proll( 1000)
console.log(prollFunc);
// 开始
prollFunc.start(func)
// 5s后结束
setTimeout(prollFunc.cancel,5000)