1

ReactiveVarデータストアで更新トリガーとして使用されるMeteorがあります。ただし、リアクティブ変数が設定されるたびにトラッカーが実行されるわけではありません。

状態が立て続けに設定されると、トラッカーが実行されないことがあるようです。

これは私の店のコードです:

const myStore = {
    states = {
        ...
    },

    updateTrigger = new ReactiveVar({ name: null, timeStamp: null }),

    setState({ name, value }) {
        this.states[name] = value;
        console.log('Set State', name);
        this.updateTrigger.set({ name, timeStamp: new Date().getTime() });
    },
};

そしてトラッカー:

Tracker.autorun(() => {
    const updateTrigger = myStore.updateTrigger.get();
    console.log('Tracker', updateTrigger.name);
    if (updateTrigger.name === state-two) myFunction();
});

コンソールはこれを記録します:

'Set State state-one' // update state-one
'Tracker state-one'
'Set State state-two' // update state-two
'Set State state-one' // update state-one
'Tracker state-one'
'Set State state-three' // update state-three
'Tracker state-three'
'Set State state-one' // update state-one
'Set State state-two' // update state-two
'Set State state-three' // update state-three
'Tracker state-three'

なぜこれが起こっているのかわかりません。

どの更新をログに記録し、どの更新を記録しないかが無差別であるため、競合状態のように見えます。

状態は非常に頻繁に更新されます (状態は 1.5 秒ごとに 1 回、その後は約 1 秒ごとに更新されます)。

何がうまくいかないのか、または他のアプローチについての提案は歓迎します。

PubSub パッケージを使用できます。Tracker一般に、私はandの大ファンではありませんが、ここでのベスト プラクティスが何であるかはわかりません。また、 +ReactiveVarを使用したくない場所もあれば、PubSub を使用したくない場所もあります。TrackerReactiveVar

ReactiveVar更新時に状態をデータベースに永続化する必要があるため、個々の状態をオプションとして持つことはできません。

4

1 に答える 1

1

これは、トラッカーのフラッシュ サイクルによるものです。

トラッカーのマニュアルから:

... デフォルトでは、すべての JavaScript コードの実行が終了し、システムがアイドル状態になると、リアクティブ値へのすべての変更がバッチ処理され、一度に有効になります。... このプロセスは ... フラッシュと呼ばれ、を呼び出して手動でトリガーすることもできTracker.flush()ます。

したがって、コードに明示的なフラッシュを追加すると、望ましい効果が得られます。

const myStore = {
    states = {
        ...
    },

    updateTrigger = new ReactiveVar({ name: null, timeStamp: null }),

    setState({ name, value }) {
        this.states[name] = value;
        console.log('Set State', name);
        this.updateTrigger.set({ name, timeStamp: new Date().getTime() });
        Tracker.flush(); // added this
    },
};
于 2016-06-29T13:25:14.253 に答える