遇到一道面试题
要求大概是说,实现个调度器,然后能根据配置间隔调用方法,也可以指定间隔循环调用方法等
写完之后也没有通过,不知道哪里出了问题,运行是没问题的。
等待有缘人指出问题吧
const options = {
key: '注册名称',
fn: '被调度函数',
loopArray: '时间循环,时间间隔,如果type为loop,当间隔数用完后,最后一个间隔数作为时间间隔循环',
type: '是否循环'
}
class TimeControll {
constructor(){
this.eventList = new Object();
this.dt = 0;
this.timer = null;
}
/**
* 注册进入调度器
* @param options 注册配置项 {@link options}
*/
addEvent({key,fn,loopArray,type}){
if(this.eventList.hasOwnProperty(key)){
throw new Error('field key cannot be duplicate')
return;
}
this.eventList[key] = {
loopArray,type,fn
}
}
removeEvenet(key){
delete this.eventList[key]
}
start(){
if(this.timer) return;
this.timer = setInterval(() => {
this.dt++;
Object.keys(this.eventList).map((v,k) => {
if(this.eventList[v].loopArray.length == 1 && this.eventList[v].type == 'loop'){
this.eventList[v].loopArray.push(this.eventList[v].loopArray[0]); // 复制个时间留着下次用
}
this.eventList[v].loopArray[0]--;
if(!this.eventList[v].loopArray[0]){
this.eventList[v].loopArray.splice(0,1);
this.eventList[v].fn(this.dt);
}
if(!this.eventList[v].loopArray.length){
this.removeEvenet(v);
}
})
},1000)
}
stop(){
clearInterval(this.timer);
this.timer = null;
}
}
调用
let timeControll = new TimeControll();
timeControll.addEvent({
key: 'a',
fn: function (dt){
console.log(dt,'a');
},
loopArray:[1,3,5],
type: 'loop'
})
timeControll.addEvent({
key: 'b',
fn: function (dt){
console.log(dt,'b');
},
loopArray:[3,3,2],
type: 'noloop'
})
timeControll.start();
输出
输出此致
敬礼~
小旋风
我建了一个前端微信交流群,欢迎大家加入,qq中转群号:1076484243
网友评论