流星跟踪器意外跳过

Meteor tracker skips unexpectedly

我正在学习有关 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

为什么会这样?

我猜测这里存在竞争条件。因为它执行行

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

.. 这么快,当 getter 重新运行无效计算时,设置值为 "Cheese".

要对此进行测试,请考虑 运行 以下内容:

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

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