有没有办法知道流星订阅何时"有效"?

Tom*_*man 5 publish-subscribe meteor

如果我更改Sessionvar并触发重新订阅autosubscribe,是否有任何回调机制要等到"最新"数据从服务器关闭?[1]

如果您看一下这个要点,您会看到一些代码随着订阅的变化而记录集合的内容.输出的相关部分:

at Subscribed; comments are: first post on #1 - second post on #1 
at Flushed; comments are: first post on #1 - second post on #1 
at Subscription complete; comments are: first post on #1 - second post on #1 - first post on #2 - second post on #2
Run Code Online (Sandbox Code Playgroud)

因此,即使在(a)呼叫之后.subscribe,(b)呼叫Meteor.flush(c)在onReady回调中.subscribe; 集合中仍有陈旧数据,只有第三种情况才是"正确"的数据.

我意识到反应模板.observe最终将收到正确的数据,并且事情将"稳定"到正确的状态.但是,有什么方法我们可以说我们还没有吗?

例如,大多数流星示例应用程序(以及我自己的应用程序)都倾向于略微抖动(类似于FOUC),而数据被添加+从订阅集合中删除.如果我们可以告诉订阅是"加载",我们可以对此做些什么.

[1]显然,服务器上的数据是不断变化的,但正如你在gist中看到的那样,我不能(没有超时)找到一个甚至是正确的点.因此我在问题中使用'有效'.

一个非常简单和常见的用例

带上madewith app; 当你第一次加载它时,似乎没有注册的应用程序,直到数据下线后,应用程序突然出现.

原因就是这个问题Meteor.subscribe已被调用,但数据还没有下线.但是模板没有简单的方法来告诉数据是否有待处理,并且它应该显示"加载"模板.在madewith实际上他们做的,当数据加载的东西,但是这是一个回调,从而跳出了做事的正常流星的方式(即反应编码).

能够编写如下内容会更好(IMO):

 {{unless apps_loaded}}{{> loading}}{{/unless}}
Run Code Online (Sandbox Code Playgroud)

 Template.madewith.apps_loaded = function() { return !Apps.isComplete(); }
Run Code Online (Sandbox Code Playgroud)

deb*_*lis 3

有趣的问题。

接收新订阅通知的正确位置是onReady回调。请注意,那里发生的日志记录始终包含您的新数据。检查 (a) 和 (b) 没有用,因为在调用subscribe和所有数据从服务器到达之间存在延迟。

根本问题是,onRemove一旦删除刚刚停止的订阅的数据,就不会运行等效的回调。此外,autosubscribe在停止旧的低音炮之前故意启动新的低音炮,以避免闪烁。

真正的用例是什么?大多数情况下,这样的回调是不必要的,因为模板还可以将其查询限制为应在范围内的数据。在您的示例中,呈现注释的模板帮助程序可能仅查询会话中当前的注释post_id,因此在数据库中包含额外的注释没有什么坏处。像这样的东西:

Template.post.comments = function () {
  return Comments.find({post_id: Session.get('post_id')});
};
Run Code Online (Sandbox Code Playgroud)

这允许比通用autosubscribe功能更复杂的策略,例如订阅用户查看的最后三个帖子的评论。或者,订阅每个帖子的前几条评论,然后仅在选择该帖子时单独订阅该帖子的完整评论集。