我想每5分钟运行一次特定的功能。如果我写这样的代码:
function f() {
console.log("hi");
d3.timer(f, 5*60*1000);
return true;
}
d3.timer(f, 5*60*1000);
然后f
似乎只运行一次,然后又不再运行。
我通过创建名为f
的{{1}}克隆来实现所需的行为:f2
来电f
和d3.timer(f2)
来电f2
。这看起来像一个丑陋的黑客。还有更好的方法吗?
答案 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),因此您的代码执行了以下操作:
f()
f()
在五分钟后被调用f()
登录到控制台,创建一个新的计时器,该计时器也使用f()
作为其回调,然后通过返回true
来取消该计时器。< / LI>
醇>
我的回答中的代码通过每次返回一个新的函数实例来解决问题。
当然,这只是使用setInterval
更加复杂和难以理解,所以你应该这样做。
答案 1 :(得分:12)
这听起来像是标准JavaScript setInterval()
方法的工作:
setInterval(f, 5*60*1000);
如果您需要它在每次调用时运行动画,那么d3.timer
将是有用的 - 否则,标准setInterval
和setTimeout
方法可能会更容易。
答案 2 :(得分:1)
看起来d3.interval是一个东西,并且意味着替代setInterval:https://github.com/d3/d3-timer#interval
var interval = d3.timeout(callback, interval_time, optional_delay);