Global Timer in Javascript with Multiple Callbacks

后端 未结 3 661
暗喜
暗喜 2021-01-19 10:39

I want to create a global timer object in javascript and then be able to add callbacks to it on the fly. This way I can just use one global timer in my script to execute all

3条回答
  •  被撕碎了的回忆
    2021-01-19 11:20

    Just a slightly modified version of aekeus approach. Now with pause- & resumable timers, third arguments and a faster callbacks-loop:

    function Interval(callback, freq) {
    
        // array of callback functions
        var args = arguments,
            callbacks = [callback],
            paused = false;
    
        // register the global timer
        var id = setInterval(function () {
            if(paused) return;
            var len = callbacks.length,
                i = len;
            while(i--) callbacks[len - 1 - i].apply(Interval, Array.prototype.slice.call(args, 2, args.length));
        }, freq);
    
        // return a Global Timer object
        return {
            id: function () {
                return id;
            },
            add: function (cb) {
                callbacks.push(cb);
            },
            clear: function () {
                if (id === null) return;
                clearInterval(id);
                id = null;
            },
            pause: function(){
                paused = true;
            },
            resume: function(){
                paused = false;
            }
        };
    }
    

    You can pass in extra-arguments like with default setInterval's (even in IE lt 9):

    function callback(date) {
        console.log(date);
    }
    
    var interval = Interval(callback, 1000, new Date);
    

    Usage example:

    var interval = Interval(function () {
        console.log("init", new Date);
    }, 1000);
    
    interval.add(function () {
        console.log("a", new Date);
    });
    
    interval.add(function () {
        console.log("b", new Date);
    });
    
    document.onmousedown = interval.pause;
    document.onmouseup = interval.resume;
    

提交回复
热议问题