【问题标题】:Tracker.autorun() not running on every update of a ReactiveVarTracker.autorun() 不会在每次更新 ReactiveVar 时运行
【发布时间】:2016-06-29 09:54:25
【问题描述】:

我有一个 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 不是一种选择,因为我需要在更新时将状态持久化到数据库中。

【问题讨论】:

  • 您是否设法找出导致问题的原因?如果没有,您能否提供最小限度的复制,以便该问题对社区具有更大的价值?就目前而言,它是未解决且不可重现的。

标签: javascript meteor publish-subscribe meteor-tracker


【解决方案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
    },
};

【讨论】:

  • 不幸的是,我仍然遇到问题。这会导致错误,指出它无法在刷新周期中刷新。此外,有时我会在同一个更新循环中两次更新 Tracker。你知道在 Meteor 中使用 PubSub 事件的最佳实践吗?
  • 那么您需要提供一些可重现的样本。您可能会遇到一些竞争状况。观察者模式可能更适合这种情况,但让我们看一个完整的示例以及您正在尝试做什么。 ES6 代理也可能是一个可行的选择。
  • 谢谢,会调查这些事情。我想我宁愿在这里使用观察者,感觉就像我在试图破解 ReactiveVar 和 Tracker 来做一些它并不是真正设计要做的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多