首次运行Deps.autorun后,有没有办法知道数据最初是从服务器完全提取的?
例如:
Deps.autorun(function () {
var data = ItemsCollection.find().fetch();
console.log(data);
});
最初,我的控制台日志将显示Object { items=[0] }
,因为尚未从服务器获取数据。我可以处理这个第一次运行。
然而,问题是每当收到数据时都会重新运行该功能,这可能不是在加载完整集合时。例如,我有时会快速收到Object { items=[12] }
后跟Object { items=[13] }
(这不是由于其他客户更改数据)。
那么 - 有没有办法知道某个依赖函数及其中的所有集合何时发生了满载?
答案 0 :(得分:2)
您需要在某处存储订阅句柄,然后使用ready
方法确定初始数据加载是否已完成。
因此,如果您使用以下方式订阅该集合:
itemSub = Meteor.subscribe('itemcollections', blah blah...)
然后,您可以使用以下内容包围find
和console.log
语句
if (itemSub.ready()) { ... }
并且只有在收到初始数据集后才会执行它们。
请注意,如果集合处理器在收到某些项目之前收集句柄将稍微返回ready
,并且您正在处理显着的延迟,则会有可能的 ocassions,但是问题应该很小。有关ready ()
方法实际运作的原因和方式的更多信息,请参阅this。
答案 1 :(得分:1)
Meteor.subscribe返回一个带有被动就绪方法的句柄,当“已发送记录集的初始完整快照”时,该方法设置为true(参见http://docs.meteor.com/#publish_ready)
使用此信息,您可以设计一些简单的信息,例如:
var waitList=[Meteor.subscribe("firstSub"),Meteor.subscribe("secondSub"),...];
Deps.autorun(function(){
// http://underscorejs.org/#every
var waitListReady=_.every(waitList,function(handle){
return handle.ready();
});
if(waitListReady){
console.log("Every documents sent in publications is now available.");
}
});
除非你是玩具项目的原型,否则这不是一个可靠的设计,你可能想要使用铁路由器(http://atmospherejs.com/package/iron-router),它提供了很好的设计模式来解决这类问题。
特别是花一点时间看一下主铁路由器撰稿人的这三个视频:
https://www.eventedmind.com/feed/waiting-on-subscriptions
https://www.eventedmind.com/feed/the-reactive-waitlist-data-structure
https://www.eventedmind.com/feed/using-wait-waiton-and-ready-in-routes