0

非常简单的事情让我很难过。我可以通过使用创建一个空白应用程序来重现该问题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}

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

谢谢。

4

1 回答 1

2

可能是 Meteor 实际上还没有建立到服务器的连接,记住meteor 首先在客户端加载 js 和 html(此时所有代码都运行),然后它尝试连接到服务器。

在此状态期间,您告诉它插入的命令进入队列,当它连接时,这些命令会立即插入。在客户端,如果在插入时成功,回调会立即触发。

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

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

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

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

于 2013-09-15T06:42:12.897 回答