我一直在关注大量的 meteor 示例并通过发现 meteor 进行工作,现在我留下了很多问题。我知道 subscribe
和 fetch
是让“ react 性”正常工作的方法,但我仍然不确定查找操作和订阅/获取之间的关系。我将尝试提出一些问题,以探究一些整体/概念性的答案。
问题集 1:
在以下示例中,我们将获取 1 个对象并订阅其更改:
Meteor.subscribe('mycollection', someID);
Mycollection.findOne(someID);
这里的操作顺序重要吗?
此订阅何时“过期”?
问题集 2:
在某些情况下,我们想要外键查找并使用fetch
,如下所示:
MyCollection2.find({myCollection1Id: doc1Id}).fetch();
使用fetch
时我们还需要MyCollection2.subscribe
吗?
订阅如何与“外键”一起使用?
fetch ~= 是订阅吗?
问题集 3:
Tracker.autorun
的正确用法是什么?
为什么/什么时候应该使用它而不是订阅或获取?
最佳答案
订阅并查找/获取时会发生什么
客户端调用
subscribe
,通知服务器客户端想要查看一组特定的文档。服务器接受或拒绝订阅请求并发布匹配的文档集。
稍后(网络延迟后)文档到达客户端。它们存储在浏览器中名为 minimongo 的数据库中。
对存储上述文档的集合进行后续的
<fetch
/find
将查询 minimongo(而不是服务器)。如果订阅的文档集发生变化,服务器将向客户端发布新的副本。
推荐阅读:understanding meteor publications and subscriptions .
问题 1
顺序很重要。您无法查看尚未订阅的文档(假设自动发布
已关闭)。然而,正如我在 common mistakes 中指出的那样,订阅不会被阻止。因此,订阅后立即获取应该返回 undefined
。
订阅不会自行停止。详情如下:
全局订阅(在路由器或模板之外进行的订阅)将永远不会停止,直到您调用其 stop方法。
当路线发生变化时,路线订阅(铁路由器)将停止(有一些注意事项)。
A template subscription当模板被销毁时将会停止。
问题2
这应该主要由我答案的第一部分来解释。您需要两组文档才能在客户端上加入它们。您可以从服务器一次发布这两个集合,也可以单独发布 - 这是一个复杂的主题,取决于您的用例。
问题3
这两者有些正交。 autorun
是一种创建响应式(Reactive)计算的方法(只要响应式(Reactive)变量发生变化就会运行的函数) - 请参阅 reactivity 部分。来自文档。 find
/fetch
或 subscribe
可能在 autorun
内发生,具体取决于您的用例。一旦您更多地了解 Meteor 的工作原理,这一点可能会变得更加清晰。
关于javascript - Meteor.subscribe 和 MyCollection.find* 操作如何交互?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32446599/