【问题标题】:Meteor Deps.Autorun know when data has been fully fetchedMeteor Deps.Autorun 知道数据何时被完全提取
【发布时间】:2014-08-10 19:06:38
【问题描述】:

在第一次运行 Deps.autorun 后,有没有办法知道何时最初从服务器完全获取数据?

例如:

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

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

但是,问题在于,只要接收到数据(可能不是在加载完整集合时),该函数就会重新运行。例如,我有时会很快收到Object { items=[12] },然后是Object { items=[13] }(这不是由于另一个客户端更改数据)。

那么 - 有没有办法知道某个依赖函数和其中的所有集合何时发生完全加载?

【问题讨论】:

    标签: meteor


    【解决方案1】:

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

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

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

    然后,您可以在您的 findconsole.log 语句周围加上:

    if (itemSub.ready()) { ... }
    

    只有在收到初始数据集后才会执行。

    请注意,如果集合很大并且您正在处理显着的延迟,那么集合句柄将在收到某些项目之前略微返回 ready 时,可能很小。有关ready () 方法实际工作的原因和方式的更多信息,请参阅this

    【讨论】:

      【解决方案2】:

      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.");
        }
      });
      

      除非您正在制作玩具项目的原型,否则这不是一个可靠的设计,您可能希望使用 Iron-router (http://atmospherejs.com/package/iron-router),它提供了很好的设计模式来解决此类问题。

      特别是,花点时间看看这 3 个来自 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

      【讨论】:

        猜你喜欢
        • 2013-09-27
        • 2014-11-02
        • 2015-06-03
        • 1970-01-01
        • 2012-04-25
        • 2017-01-31
        • 1970-01-01
        • 2011-01-18
        • 1970-01-01
        相关资源
        最近更新 更多