如果我换一个 Session
var 并通过 autosubscribe
触发重新订阅,是否有任何回调机制可以等待“最新”数据从服务器关闭? [1]
如果你看看this gist您会看到一些代码随着订阅的变化记录集合的内容。输出的相关部分:
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
因此,即使在 (a) 调用
.subscribe
之后, (b) 调用 Meteor.flush
(c) 在 onReady
内.subscribe
的回调;集合中仍然有陈旧的数据,只有在第 3 种情况下,那里才有“正确”的数据。我意识到响应式(Reactive)模板和
.observe
最终将收到正确的数据,事情将“稳定”到正确的状态。但是有什么方法可以告诉我们我们还没有到那里吗?例如,大多数 meteor 示例应用程序(和我自己的应用程序)在从订阅的集合中添加和删除数据时都容易出现一点抖动(类似于 FOUC)。如果我们可以判断订阅正在“加载”,我们就可以对此做一些事情。
[1] 显然服务器上的数据在不断变化,但正如您在要点中所见,我无法(没有超时)找到它甚至正确的点。因此,我在问题中使用了“有效”。
一个非常简单和常见的用例
以 madewith 应用程序为例;当您第一次加载它时,似乎没有注册应用程序,直到数据从网络上下来并且应用程序突然出现。
这样做的原因是
Meteor.subscribe
已被调用,但数据尚未传输。但是没有简单的方法让模板告诉数据正在挂起并且它应该显示一个“加载”模板。在 madewith当数据加载时,它们实际上会做一些事情,但这是一个回调,因此打破了正常的 meteor 做事方式(即响应式(Reactive)编码)。能够编写如下内容会更好(IMO):
{{unless apps_loaded}}{{> loading}}{{/unless}}
和
Template.madewith.apps_loaded = function() { return !Apps.isComplete(); }
最佳答案
有趣的问题。
接收新订阅通知的正确位置是 onReady
打回来。请注意,发生在那里的日志记录始终包含您的新数据。检查 (a) 和 (b) 没有用,因为调用 subscribe
之间存在延迟当所有数据从服务器到达时。
潜在的问题是没有等效的 onRemove
删除刚停止订阅的数据后运行的回调。此外,autosubscribe
在停止旧潜艇之前故意启动新潜艇,以避免闪烁。
真正的用例是什么?大多数情况下不需要这样的回调,因为模板还可以将它们的查询限制为应该在范围内的数据。在您的示例中,呈现评论的模板助手可能仅查询具有当前 post_id
的评论。在 Session 中,所以在数据库中有额外的评论没有坏处。
像这样的东西:
Template.post.comments = function () {
return Comments.find({post_id: Session.get('post_id')});
};
这允许策略比通用
autosubscribe
更复杂。功能,例如订阅用户查看的最后三个帖子的评论。或者,订阅每个帖子的前几条评论,然后仅在选择该帖子时单独订阅该帖子的完整评论集。
关于meteor - 有没有办法知道 meteor 订阅何时是 'valid' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10794555/