UNPKG

d3

Version:

A small, free JavaScript library for manipulating documents based on data.

105 lines (91 loc) 2.4 kB
var d3_timer_queue = null, d3_timer_interval, // is an interval (or frame) active? d3_timer_timeout; // is a timeout active? // The timer will continue to fire until callback returns true. d3.timer = function(callback, delay, then) { var found = false, t0, t1 = d3_timer_queue; if (arguments.length < 3) { if (arguments.length < 2) delay = 0; else if (!isFinite(delay)) return; then = Date.now(); } // See if the callback's already in the queue. while (t1) { if (t1.callback === callback) { t1.then = then; t1.delay = delay; found = true; break; } t0 = t1; t1 = t1.next; } // Otherwise, add the callback to the queue. if (!found) d3_timer_queue = { callback: callback, then: then, delay: delay, next: d3_timer_queue }; // Start animatin'! if (!d3_timer_interval) { d3_timer_timeout = clearTimeout(d3_timer_timeout); d3_timer_interval = 1; d3_timer_frame(d3_timer_step); } } function d3_timer_step() { var elapsed, now = Date.now(), t1 = d3_timer_queue; while (t1) { elapsed = now - t1.then; if (elapsed >= t1.delay) t1.flush = t1.callback(elapsed); t1 = t1.next; } var delay = d3_timer_flush() - now; if (delay > 24) { if (isFinite(delay)) { clearTimeout(d3_timer_timeout); d3_timer_timeout = setTimeout(d3_timer_step, delay); } d3_timer_interval = 0; } else { d3_timer_interval = 1; d3_timer_frame(d3_timer_step); } } d3.timer.flush = function() { var elapsed, now = Date.now(), t1 = d3_timer_queue; while (t1) { elapsed = now - t1.then; if (!t1.delay) t1.flush = t1.callback(elapsed); t1 = t1.next; } d3_timer_flush(); }; // Flush after callbacks, to avoid concurrent queue modification. function d3_timer_flush() { var t0 = null, t1 = d3_timer_queue, then = Infinity; while (t1) { if (t1.flush) { t1 = t0 ? t0.next = t1.next : d3_timer_queue = t1.next; } else { then = Math.min(then, t1.then + t1.delay); t1 = (t0 = t1).next; } } return then; } var d3_timer_frame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(callback) { setTimeout(callback, 17); };