美文网首页
js实现一个时间调度器

js实现一个时间调度器

作者: 前端小旋风 | 来源:发表于2020-06-21 14:39 被阅读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

    相关文章

      网友评论

          本文标题:js实现一个时间调度器

          本文链接:https://www.haomeiwen.com/subject/uxqaxktx.html