10

特定の機能を 5 分ごとに実行したい。次のようなコードを書くと:

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

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

その後、f一度実行された後、二度と実行されないようです。

fcalled f2: fcallsd3.timer(f2)f2callのクローンを作成することで、目的の動作を実現しました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()5分後に呼ばれる
  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

d3.interval のように見え、setInterval の代わりになることを意図しています: https://github.com/d3/d3-timer#interval

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