Meteor Deps.Autorun知道数据何时被完全取出

时间:2014-08-10 10:35:47

标签: meteor

首次运行Deps.autorun后,有没有办法知道数据最初是从服务器完全提取的?

例如:

Deps.autorun(function () {
    var data = ItemsCollection.find().fetch();
    console.log(data);
});

最初,我的控制台日志将显示Object { items=[0] },因为尚未从服务器获取数据。我可以处理这个第一次运行。

然而,问题是每当收到数据时都会重新运行该功能,这可能不是在加载完整集合时。例如,我有时会快速收到Object { items=[12] }后跟Object { items=[13] }(这不是由于其他客户更改数据)。

那么 - 有没有办法知道某个依赖函数及其中的所有集合何时发生了满载?

2 个答案:

答案 0 :(得分:2)

您需要在某处存储订阅句柄,然后使用ready方法确定初始数据加载是否已完成。

因此,如果您使用以下方式订阅该集合:

itemSub = Meteor.subscribe('itemcollections', blah blah...)

然后,您可以使用以下内容包围findconsole.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

相关问题