Javascript 延迟订阅处理以避免DDP超时

Javascript 延迟订阅处理以避免DDP超时,javascript,google-maps,google-maps-api-3,meteor,Javascript,Google Maps,Google Maps Api 3,Meteor,我有多个订阅,其中描述了数据以及该数据的每个用户状态。最终这会显示在谷歌地图上 我们称之为: 店铺-店铺id、名称和位置的列表。此集合使用当前映射边界作为对返回数据的限制。 评级-该商店的每位用户得分。目前,无论商店是否在视野中,所有评级都会返回。 每个订阅当前都在其自己的Tracker.autorun块中运行。这是可行的,但是如果商店的数量超过了给定的限制,坏事就会发生。这里的缺点是DDP以某种方式超时,重新同步开始,超时,重新同步。。。永远 请不要建议在谷歌地图上添加20000个标记是个坏主

我有多个订阅,其中描述了数据以及该数据的每个用户状态。最终这会显示在谷歌地图上

我们称之为:

店铺-店铺id、名称和位置的列表。此集合使用当前映射边界作为对返回数据的限制。 评级-该商店的每位用户得分。目前,无论商店是否在视野中,所有评级都会返回。 每个订阅当前都在其自己的Tracker.autorun块中运行。这是可行的,但是如果商店的数量超过了给定的限制,坏事就会发生。这里的缺点是DDP以某种方式超时,重新同步开始,超时,重新同步。。。永远

请不要建议在谷歌地图上添加20000个标记是个坏主意。我知道这一点,但我想在这个发展阶段做这件事

坏方法:

最初,我在商店的游标观察器中创建了标记,并调用findOne查找商店是否有评级。因为MiniMongo没有索引,所以它的扩展性很差,因此成为了整个评级集合的线性搜索

首先,改进:

后来,我将在地图上添加商店作为第二阶段。如果订阅已完全就绪,我将执行查找并在那里添加店铺。这基本上奏效了。它防止了DDP超时,但仍然需要很长时间来处理车间数据,而内部findOne调用仍然是线性的

第二次精炼:

我只在加载所有评级数据后才订阅商店。这是一个很小的改变,但实际上稍微提高了性能。我怀疑这是因为以前,商店是先加载的,然后随着评级的增加,标记必须更新。防止这种双重更新会让事情变得更好

潜在的第三次精炼:

该计划允许通过为两个集合游标添加、更改和删除回调来实时加载内容。但是,我没有使用findOne来检查评级,而是使用评级回调来使用店铺ID填充对象,如果存在标记,则更新它。然后,该对象由“车间添加标记”和“更新标记代码”引用。例如:

@ratings = {}

recordRating: (id, rating) ->
   @ratings[id] = rating
   @updateMarker(id)
removeRating: (id) ->
   delete @ratings[id]
   @updateMarker(id)

要做到这一点,需要重构一些工作。在我冒险之前,有没有更好的办法?是否有Meteor软件包可以帮助解决我没有发现的问题?

您是否认为您正在尝试被动加入?Iron路由器可以帮助管理waitOn依赖项。此外,是否可以在商店中存储一些最低限度的汇总评级信息?然后,在其他一些交互中可以检索到实际的Rating full对象?是的,实际上,这就是我正在做的。我想要所有的商店,但我也想要那些商店上的特定于用户的标志。在这种情况下,我现在选择了我的选项3。我不希望在检索所有数据时地图延迟加载,这允许我从2k位置扩展到50k左右。