js实现一个时间调度器

2020-06-21  本文已影响0人  前端小旋风

遇到一道面试题
要求大概是说,实现个调度器,然后能根据配置间隔调用方法,也可以指定间隔循环调用方法等
写完之后也没有通过,不知道哪里出了问题,运行是没问题的。
等待有缘人指出问题吧

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

上一篇下一篇

猜你喜欢

热点阅读