如何在d3.js中设置周期计时器?

如何在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

我想每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
setInterval()方法的工作:

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);