在第一次运行Deps.autorun之后,是否有一种方法可以知道数据最初是什么时候完全从服务器上获取的?
例如:
Deps.autorun(function () {
var data = ItemsCollection.find().fetch();
console.log(data);
});
最初,我的控制台日志将显示Object { items=[0] }
,因为尚未从服务器获取数据。我能应付这第一轮。
但是,问题是,每当收到数据时,函数就会重新运行,而在加载完整集合时,数据可能不是这样。例如,我有时会很快地收到Object { items=[12] }
,然后是Object { items=[13] }
(这不是由于另一个客户端更改数据造成的)。
那么--是否有一种方法可以知道某一依赖函数及其内的所有集合何时发生了满载?
发布于 2014-08-10 03:06:38
Meteor.subscribe返回一个带有反应性就绪方法的句柄,当“发送了记录集的初始完整快照”时,该方法设置为true (参见准备好的)
使用这些信息,您可以设计一些简单的东西,例如:
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),它提供了很好的设计模式来解决这类问题。
特别是,花点时间来看看这3段主要的铁路由器贡献者的视频:
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
发布于 2014-08-10 03:00:16
您需要在某个地方存储订阅句柄,然后使用ready
方法确定初始数据加载是否已经完成。
因此,如果您使用以下方法订阅集合:
itemSub = Meteor.subscribe('itemcollections', blah blah...)
然后,您可以用以下内容包围find
和console.log
语句:
if (itemSub.ready()) { ... }
只有在接收到初始数据集之后,才会执行它们。
请注意,如果集合很大,并且您正在处理重要的延迟,则集合句柄在接收到某些项之前可能会稍微返回ready
,但问题应该非常小。有关ready ()
方法实际工作的原因和方式的更多信息,请参见这。
https://stackoverflow.com/questions/25227732
复制相似问题