maodouio / meteor-master-classes

毛豆网Meteor在线师徒班
http://www."培养国内第一批Meteor布道者".com
15 stars 7 forks source link

先后几个dependent的数据库操作是否有必要通过callback来serialize? #13

Open seanjsong opened 9 years ago

seanjsong commented 9 years ago

在李老师的task1的commit中是这样生成测试数据的:

https://github.com/limingth/meteor-master-classes/blob/8bdd6dfec51c4bd9ae84dcf08b577108bc6d1a16/demo/server/seeds.js

Meteor.startup(function () {

  if (Posts.find({}).count() >= 0) {
    Posts.remove({});
    _(5).times(function(n){
        Posts.insert({
        title: Fake.word(),
        body: Fake.sentence(),
        published: Fake.fromArray([true, false])
      });
    });
  }

});

我自己在做task1时也试过这样的方法,绝大多数时候是没问题,但有那么一两次,meteor deploy到meteor.com之后,测试数据显示不出来,Posts列表是空的。在localhost上从来没有出过问题。

我在猜测产生问题的可能原因,有没有可能是因为Posts.remove()和Posts.insert()本质上是异步的,哪个先做完不一定,结果是先插入记录之后又全部删掉了?是不是有必要把第二步的多个insert操作放在第一步remove操作的callback里面去做,以保证串行执行?

kevingzhang commented 9 years ago
  1. Meteor 使用了 Fiber 技术, 从而使得这些数据库操作实际上"串行"完成的. 这个可以讲座时候单独说. 到时候提醒我. 所以 remove 和 insert 一定不会并行出错误
  2. 那段代码我感觉逻辑奇怪, 为啥每次 startup 时候都要清除已有的 Posts,然后重新增加新的. 动机我不太了解 . 即是如此, 不应该出错. 建议增加 log 检查
kevingzhang commented 9 years ago

https://meteorhacks.com/fibers-eventloop-and-meteor.html