10

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

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

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

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

我通过创建被调用的克隆来实现所需的f行为f2f调用d3.timer(f2)f2调用d3.timer(f)。这似乎是一个丑陋的黑客。有没有更好的办法?

4

3 回答 3

14

我认为@nrabinowitz 的答案可能是最好和最简单的,但如果你真的想使用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. f()五分钟后调用
  3. f()登录到控制台,创建一个新的计时器,该计时器也f()用作其回调,然后通过返回取消该计时器true

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

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

于 2012-11-15T17:56:57.863 回答
12

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

setInterval(f, 5*60*1000);

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

于 2012-11-15T17:52:03.940 回答
1

Looks like d3.interval is a thing, and is meant to be a replacement for setInterval: https://github.com/d3/d3-timer#interval

var interval = d3.timeout(callback, interval_time, optional_delay);
于 2017-01-03T05:19:21.377 回答