meteor - 有没有办法知道 meteor 订阅何时是 'valid' ?

标签 meteor publish-subscribe

如果我换一个 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/

相关文章:

collections - 发布/订阅同一服务器集合的多个子集

javascript - 通过索引访问数组

javascript - 如何使用 iron router 显示静态 html 文件

publish-subscribe - 在 Pub-Sub 架构中发送响应

java - JMS 中的点对点与发布/订阅模型

javascript - 用 Pubnub 替换 Socket io (WebRTC)

.net - NServiceBus:找不到(消息)的元数据

meteor - Meteor 中的 Jade 模板

javascript - 我如何使用 meteor subscriptionsReady() 来确保数据在渲染模板之前就绪?

javascript - 在两个 meteor 模板之间推送数据