Skip to content

Instantly share code, notes, and snippets.

@andrevinsky
Created December 28, 2013 16:57
Show Gist options
  • Select an option

  • Save andrevinsky/8161531 to your computer and use it in GitHub Desktop.

Select an option

Save andrevinsky/8161531 to your computer and use it in GitHub Desktop.

Revisions

  1. Andrew Revinsky created this gist Dec 28, 2013.
    74 changes: 74 additions & 0 deletions timer-on-deferreds.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,74 @@
    //Timer on Deferreds
    (function (){
    var top = this;
    var defaults = {
    granularity : 500,
    name : 'default'
    };

    this.Timer = function(timeout, options){
    var o = $.extend({}, defaults, options),
    granularity = o.granularity,
    name = o.name;

    var coreFunctionality, timeoutFuncRef, tickRef;

    var timeStarted = new Date() - 0,
    timeElapsed = 0,
    lastKnownTime = timeStarted,
    isRunning = false;

    return $.Deferred(function(def){
    coreFunctionality = {
    pause: function(){
    if (!isRunning)
    return;

    var time = new Date() - 0, elapsed = time - lastKnownTime;
    timeElapsed += elapsed;
    lastKnownTime = time;

    top.clearTimeout(timeoutFuncRef);
    timeoutFuncRef = null;
    isRunning = false;
    },
    resume: function(){
    if (isRunning)
    return;
    lastKnownTime = new Date() - 0;
    timeoutFuncRef = window.setTimeout(def.resolve, timeout - timeElapsed);
    isRunning = true;
    },
    stop: function(){
    def.resolve();
    cleanup();
    },
    };
    timeoutFuncRef = window.setTimeout(def.resolve, timeout - timeElapsed);
    tickRef = window.setInterval(function(){
    if (!isRunning)
    return;
    var time = new Date() - 0, elapsed = time - lastKnownTime;
    timeElapsed += elapsed;
    lastKnownTime = time;
    def.notify({
    name: name,
    total: timeout,
    elapsed: timeElapsed
    });
    }, granularity);
    isRunning = true;
    }).promise(coreFunctionality);

    function cleanup(){
    top.clearTimeout(timeoutFuncRef);
    timeoutFuncRef = null;

    top.clearInterval(tickRef);
    tickRef = null;

    isRunning = false;
    }
    };

    })();