客户端代码与控制台中的Meteor集合访问不一致

时间:2013-09-15 05:21:03

标签: meteor

非常简单的事情让我很难过。我可以使用mrt create创建一个空白应用来重现此问题,只添加以下内容:

在第1行,我创建了一个新集合:

Rounds = new Meteor.Collection('rounds');

Meteor.isClient条件代码中,我添加:

Rounds.insert({ x: 1 });

Rounds.find({}).forEach(function (round) {
    console.log(round);
});

当我第一次运行此代码(在本地,使用meteor run)时,会出现预期的行为,并将以下行打印到控制台:

Object {x: 1, _id: "ps5KdA4b9it2ktQoD"} 

但是,如果我刷新浏览器,则会发生意外情况。我希望在控制台上看到多行打印,因为我正在为我的收藏添加额外的回合。但是,只打印最近一轮:

Object {_id: "dqMuz6CmK2K9myZn5", x: 1}

相反,如果我直接在控制台中运行上面的forEach行,我会得到预期的行为,集合中每一轮都有一条打印的行:

Rounds.find({}).forEach(function (post){
  console.log(post);
})
Object {_id: "KAcopbPDE9JC2rShY", x: 1}
Object {_id: "ps5KdA4b9it2ktQoD", x: 1}
Object {_id: "dqMuz6CmK2K9myZn5", x: 1}
Object {_id: "ecbWcRXXLQANy8Xyj", x: 1}
Object {_id: "QsbczHmZZMX59LzTZ", x: 1}

为什么这两种情况的行为不同?而且,最重要的是,如何在实际代码中重现我在控制台(我期望的)中找到的行为?

感谢。

1 个答案:

答案 0 :(得分:2)

可能是Meteor还没有与服务器建立连接,请记住流星加载js&首先在客户端上运行html(此时运行所有代码),然后尝试连接到服务器。

在此状态期间,您指示其插入的命令将进入队列,该队列在连接时一次性插入。在客户端上,如果插入时成功,则回调会立即触发。

因此,当尚未完全建立连接时,将运行要插入的代码。

如果您等待连接建立(Meteor.status().connected == true)或订阅完成(通过在Meteor.subscribe的回调中插入数据),那么您不应该遇到此问题。

当您使用控制台时,已经建立了连接,这就是您在控制台中没有问题的原因。

您可以在尝试插入文档的同时运行console.log(Meteor.status().connection)并查看。