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

时间:2012-11-15 01:49:55

标签: d3.js

我想每5分钟运行一次特定的功能。如果我写这样的代码:

function f() {
    console.log("hi");
    d3.timer(f, 5*60*1000);
    return true;
}

d3.timer(f, 5*60*1000);

然后f似乎只运行一次,然后又不再运行。

我通过创建名为f的{​​{1}}克隆来实现所需的行为:f2来电fd3.timer(f2)来电f2。这看起来像一个丑陋的黑客。还有更好的方法吗?

3 个答案:

答案 0 :(得分:14)

我认为@nrabinowitz's answer可能是最好也是最简单的,但如果你真的想使用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将计时器映射到函数实例(请参阅此处的代码:https://github.com/mbostock/d3/blob/master/d3.v2.js#L4073),因此您的代码执行了以下操作:

  1. 使用回调f()
  2. 设置计时器
  3. f()在五分钟后被调用
  4. f()登录到控制台,创建一个新的计时器,该计时器也使用f()作为其回调,然后通过返回true 来取消该计时器。< / LI>

    我的回答中的代码通过每次返回一个新的函数实例来解决问题。

    当然,这只是使用setInterval更加复杂和难以理解,所以你应该这样做。

答案 1 :(得分:12)

这听起来像是标准JavaScript setInterval()方法的工作:

setInterval(f, 5*60*1000);

如果您需要它在每次调用时运行动画,那么d3.timer将是有用的 - 否则,标准setIntervalsetTimeout方法可能会更容易。

答案 2 :(得分:1)

看起来d3.interval是一个东西,并且意味着替代setInterval:https://github.com/d3/d3-timer#interval

var interval = d3.timeout(callback, interval_time, optional_delay);