Also fix a minor bug where we might miss the delay the first callback by an
extra frame, and allow d3.timer to be called with an optional delay.
This commit is contained in:
Mike Bostock 2011-08-16 21:21:16 -07:00
Родитель ae4306eaa6
Коммит 40b98c4d7b
5 изменённых файлов: 74 добавлений и 18 удалений

13
d3.js поставляемый
Просмотреть файл

@ -1963,7 +1963,7 @@ function d3_transition(groups) {
delay[++k] = delayMin;
});
}
d3_timer(step, delayMin);
d3.timer(step, delayMin);
return transition;
};
@ -2083,17 +2083,14 @@ var d3_timer_queue = null,
d3_timer_timeout; // is a timeout active?
// The timer will continue to fire until callback returns true.
d3.timer = function(callback) {
d3_timer(callback, 0);
};
function d3_timer(callback, delay) {
d3.timer = function(callback, delay) {
var now = Date.now(),
found = false,
t0,
t1 = d3_timer_queue;
if (!isFinite(delay)) return;
if (arguments.length < 2) delay = 0;
else if (!isFinite(delay)) return;
// See if the callback's already in the queue.
while (t1) {
@ -2130,7 +2127,7 @@ function d3_timer_step() {
while (t1) {
elapsed = now - t1.then;
if (elapsed > t1.delay) t1.flush = t1.callback(elapsed);
if (elapsed >= t1.delay) t1.flush = t1.callback(elapsed);
t1 = t1.next;
}

4
d3.min.js поставляемый

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -3,17 +3,14 @@ var d3_timer_queue = null,
d3_timer_timeout; // is a timeout active?
// The timer will continue to fire until callback returns true.
d3.timer = function(callback) {
d3_timer(callback, 0);
};
function d3_timer(callback, delay) {
d3.timer = function(callback, delay) {
var now = Date.now(),
found = false,
t0,
t1 = d3_timer_queue;
if (!isFinite(delay)) return;
if (arguments.length < 2) delay = 0;
else if (!isFinite(delay)) return;
// See if the callback's already in the queue.
while (t1) {
@ -50,7 +47,7 @@ function d3_timer_step() {
while (t1) {
elapsed = now - t1.then;
if (elapsed > t1.delay) t1.flush = t1.callback(elapsed);
if (elapsed >= t1.delay) t1.flush = t1.callback(elapsed);
t1 = t1.next;
}

Просмотреть файл

@ -123,7 +123,7 @@ function d3_transition(groups) {
delay[++k] = delayMin;
});
}
d3_timer(step, delayMin);
d3.timer(step, delayMin);
return transition;
};

62
test/core/timer-test.js Normal file
Просмотреть файл

@ -0,0 +1,62 @@
require("../env");
require("../../d3");
var vows = require("vows"),
assert = require("assert");
var suite = vows.describe("d3.timer");
suite.addBatch({
"timer": {
topic: function() {
return d3.timer;
},
"with no delay": {
topic: timer(),
"first calls after 17 ms or less": function(info) {
assert.inDelta(info.start - info.scheduled, 17, 15);
},
"calls until the function returns true": function(info) {
assert.equal(info.count, 4);
},
"calls every 17 ms": function(info) {
assert.inDelta(info.stop - info.start, 17 * 3, 15);
}
},
"with a specified delay": {
topic: timer(250),
"first calls after the delay": function(info) {
assert.inDelta(info.start - info.scheduled, 250, 15);
},
"calls until the function returns true": function(info) {
assert.equal(info.count, 4);
},
"calls every 17 ms": function(info) {
assert.inDelta(info.stop - info.start, 17 * 3, 15);
}
}
}
});
function timer(delay) {
var args = Array.prototype.slice.call(arguments);
return function() {
var cb = this.callback,
info = {scheduled: Date.now(), count: 0};
args.unshift(function() {
var count = ++info.count;
if (count === 1) {
info.start = Date.now();
} else if (count === 4) {
info.stop = Date.now();
cb(null, info);
return true;
}
});
d3.timer.apply(this, args);
};
}
suite.export(module);