Tracker.autorun()没有在每次更新ReactiveVar时运行

时间:2016-06-29 09:54:25

标签: javascript meteor publish-subscribe meteor-tracker

我有一个Meteor ReactiveVar,用作数据存储中的更新触发器。但是,每次设置反应变量时都不会运行跟踪器。

似乎有时当状态快速连续时,跟踪器无法运行。

这是我店的代码:

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秒一次,然后每隔一秒左右一次)。

任何有关出错的建议,或欢迎其他方法的建议。

我可以使用PubSub包。一般来说,我不是TrackerReactiveVar的忠实粉丝,但我不确定这里的最佳做法是什么,我不想使用某些地方有Tracker + ReactiveVar,其他地方有PubSub。

将每个单独的状态作为ReactiveVar不是选项,因为我需要在更新时将状态保存到数据库。

1 个答案:

答案 0 :(得分:1)

这是由于Tracker's Flush Cycle

从跟踪手册:

  

...默认情况下,当所有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
    },
};
相关问题