流星跟踪器意外跳过

时间:2015-07-16 05:25:46

标签: meteor meteor-tracker

我正在关注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

为什么会这样?

1 个答案:

答案 0 :(得分:1)

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

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

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

要测试此操作,请考虑运行以下命令:

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

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