【问题标题】:Meteor tracker skips unexpectedly流星跟踪器意外跳过
【发布时间】:2015-07-16 05:25:46
【问题描述】:

我正在关注有关 Tracker 的教程并看到意外行为。

在这里,我使用 getter 和 setter 来查看每当我调用 setter 时都会调用 Tracker.autorun()

if (Meteor.isClient) {
  var favoriteFood = 'Apples';
  var favoriteFoodDep = new Tracker.Dependency;

  var getFavoriteFood = function () {
    favoriteFoodDep.depend();
    return favoriteFood;
  };

  var setFavoriteFood = function (newValue) {
    favoriteFood = newValue;
    favoriteFoodDep.changed();
  };

  var handle = Tracker.autorun (function () {
    console.log("your favorite food is " + getFavoriteFood());
  });

  setFavoriteFood("Mangos");
  setFavoriteFood("Bananas");
  setFavoriteFood("Cheese");
}

当我打开浏览器控制台时,我希望看到

Your favorite food is Apples
Your favorite food is Mangos
Your favorite food is Bananas
Your favorite food is Cheese

但无论我为setFavoriteFood()打了多少电话,我看到的只是第一个和最后一个。

Your favorite food is Apples
Your favorite food is Cheese

为什么会这样?

【问题讨论】:

    标签: meteor meteor-tracker


    【解决方案1】:

    我猜这里有一个竞争条件。因为它执行行

    setFavoriteFood("Mangos");
    setFavoriteFood("Bananas");
    setFavoriteFood("Cheese");
    

    .. 这么快,当 getter 重新运行无效的计算时,设置的值是“Cheese”。

    要对此进行测试,请考虑运行以下命令:

    setFavoriteFood("Mangos");
    window.setTimeout(function() { 
      setFavoriteFood("Bananas");
    }, 1000);
    window.setTimeout(function() { 
      setFavoriteFood("Cheese");
    }, 2000);
    

    我怀疑它会将所有 4 个记录到控制台。回来报告并告诉我!

    【讨论】:

    • 就像你说的那样,这是一个竞争条件。我想知道这是微不足道的还是有更广泛的含义..
    • @MikeC - 在这种情况下,我认为这不是问题,因为我认为客户端甚至无法如此快速地处理更新。 Tracker.Dependency 对于在数据源更改时更新模板非常有用。此外,请务必查看 ReactiveVars - 使用跟踪器对变量进行非常简单的包装,具体取决于获取和无效设置 docs.meteor.com/#/full/reactivevar_pkg
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 2015-09-01
    • 2019-08-05
    • 1970-01-01
    相关资源
    最近更新 更多