首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >流星Deps.Autorun知道数据何时被完全获取

流星Deps.Autorun知道数据何时被完全获取
EN

Stack Overflow用户
提问于 2014-08-10 10:35:47
回答 2查看 176关注 0票数 1

在第一次运行Deps.autorun之后,是否有一种方法可以知道数据最初是什么时候完全从服务器上获取的?

例如:

代码语言:javascript
代码运行次数:0
运行
复制
Deps.autorun(function () {
    var data = ItemsCollection.find().fetch();
    console.log(data);
});

最初,我的控制台日志将显示Object { items=[0] },因为尚未从服务器获取数据。我能应付这第一轮。

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

那么--是否有一种方法可以知道某一依赖函数及其内的所有集合何时发生了满载?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-10 11:06:38

Meteor.subscribe返回一个带有反应性就绪方法的句柄,当“发送了记录集的初始完整快照”时,该方法设置为true (参见准备好的)

使用这些信息,您可以设计一些简单的东西,例如:

代码语言:javascript
代码运行次数:0
运行
复制
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

票数 1
EN

Stack Overflow用户

发布于 2014-08-10 11:00:16

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

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

代码语言:javascript
代码运行次数:0
运行
复制
itemSub = Meteor.subscribe('itemcollections', blah blah...)

然后,您可以用以下内容包围findconsole.log语句:

代码语言:javascript
代码运行次数:0
运行
复制
if (itemSub.ready()) { ... }

只有在接收到初始数据集之后,才会执行它们。

请注意,如果集合很大,并且您正在处理重要的延迟,则集合句柄在接收到某些项之前可能会稍微返回ready,但问题应该非常小。有关ready ()方法实际工作的原因和方式的更多信息,请参见

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25227732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档