非常简单的事情让我很难过。我可以使用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}
为什么这两种情况的行为不同?而且,最重要的是,如何在实际代码中重现我在控制台(我期望的)中找到的行为?
感谢。
答案 0 :(得分:2)
可能是Meteor还没有与服务器建立连接,请记住流星加载js&首先在客户端上运行html(此时运行所有代码),然后尝试连接到服务器。
在此状态期间,您指示其插入的命令将进入队列,该队列在连接时一次性插入。在客户端上,如果插入时成功,则回调会立即触发。
因此,当尚未完全建立连接时,将运行要插入的代码。
如果您等待连接建立(Meteor.status().connected == true
)或订阅完成(通过在Meteor.subscribe
的回调中插入数据),那么您不应该遇到此问题。
当您使用控制台时,已经建立了连接,这就是您在控制台中没有问题的原因。
您可以在尝试插入文档的同时运行console.log(Meteor.status().connection)
并查看。