1

我有一个 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 包。Tracker一般来说,我不是and的忠实粉丝ReactiveVar,但我不确定这里的最佳做法是什么,我不想在某些地方使用Tracker+ ReactiveVar,而在其他地方使用 PubSub。

将每个单独的状态作为一个ReactiveVar选项并不是一种选择,因为我需要在更新时将状态持久化到数据库中。

4

1 回答 1

1

这是由于Tracker 的刷新周期

从跟踪器手册:

...默认情况下,当所有 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 回答