如何在d3.js中设置周期计时器?
我想每5分钟运行一个特定的函数。如果我写这样的代码:如何在d3.js中设置周期计时器?,d3.js,D3.js,我想每5分钟运行一个特定的函数。如果我写这样的代码: function f() { console.log("hi"); d3.timer(f, 5*60*1000); return true; } d3.timer(f, 5*60*1000); 然后f似乎运行一次,然后再也不会运行 我通过创建名为f2的f克隆来实现所需的行为:f调用d3.timer(f2)和f2调用d3.timer(f)。这看起来像一个丑陋的黑客。有更好的方法吗?这听起来像是标准JavaScript
function f() {
console.log("hi");
d3.timer(f, 5*60*1000);
return true;
}
d3.timer(f, 5*60*1000);
然后f
似乎运行一次,然后再也不会运行
我通过创建名为
f2
的f
克隆来实现所需的行为:f
调用d3.timer(f2)
和f2
调用d3.timer(f)
。这看起来像一个丑陋的黑客。有更好的方法吗?这听起来像是标准JavaScriptsetInterval()方法的工作:
setInterval(f, 5*60*1000);
如果您需要它在每次调用时运行动画,那么d3.timer
将非常有用-否则,标准的setInterval
和setTimeout
方法可能会更简单。我认为这可能是最好、最简单的方法,但如果您真的想使用d3.timer
,这是你要怎么做的
var interval = 1000; // one second in milliseconds
var makeCallback = function() {
// note that we're returning a new callback function each time
return function() {
console.log('OH HAI!!');
d3.timer(makeCallback(), interval);
return true;
}
};
d3.timer(makeCallback(), interval);
您的代码未按预期工作,因为d3.js将计时器映射到函数实例(请参见此处的代码:),因此您的代码执行了以下操作:
使用回调设置计时器f()
f()
在五分钟后调用
f()
我的答案中的代码通过每次返回一个新的函数实例来解决这个问题
当然,仅仅使用setInterval
,这更复杂,也更难理解,所以您应该这样做。看起来像d3。interval是一种东西,是用来代替setInterval的:
如果我的示例不清楚,很抱歉:实际上,console.log(“hi”)
确实是一些d3动画代码。我仍然不知道为什么我(或任何人)想要使用d3.timer
而不是像setInterval
这样的标准Javascript定时器代码。事实上,如果我们可以使用setTimeout
,为什么d3.timer
会存在呢?好吧,我想这就清楚了。谢谢你的帮助!对我来说,使用地理投影,我看到使用d3定时器技术的性能提高了100倍,即cpu使用率从100%提高到了1%。我假设这是因为正在请求动画帧。此外,使用计时器可以确保当requestAnimationFrame可用时,当选项卡不在前台时,动画不会运行
var interval = d3.timeout(callback, interval_time, optional_delay);