javascript - 是否可以(使用 Meteor)控制何时将发布推送到订阅的客户端?

标签 javascript meteor

使用 Meteor 编程时,是否可以控制何时将发布(DDP 更新到本地 MiniMongo)推送到订阅的客户端。看起来默认行为是在对关联集合进行任何更改后立即推送更改。在我的应用程序中,这会非常低效并导致许多不必要的更新。

理想情况下,我想做的是延迟推送更改,直到我在另一个集合中有特定的更改。

因此,例如,如果我有以下集合以及相关的出版物和订阅:

// Client and server
Scores = new Meteor.Collection('scores');
GameState = new Meteor.Collection('gameState');

Meteor.publish('scores', function(gameId) {
    return Scores.find({id: gameId});
});

Meteor.publish('gameState', function(gameId) {
    return GameState.find({id: gameId});
});

// Client only
Meteor.subscribe('scores');
Meteor.subscribe('gameState');

我想做的是延迟更新客户端的本地“分数”集合,直到游戏状态达到特定状态。

最佳答案

如果我对问题的理解正确,您可以使用 autorun 的组合和一个 session 变量来触发订阅。像这样:

Tracker.autorun(function() {
  var gameId = Session.get('currentGame');
  if (gameId && Session.get('excitingLevel')) {
    Meteor.subscribe('scores', gameId);
    Meteor.subscribe('gameState', gameId);
  }
});

我在这里使用 excitingLevelcurrentGame(难道没有游戏在进行吗?)来激活订阅。另请注意,autorun 足够聪明,可以在不再满足条件时停止 订阅。所以如果玩家离开游戏(Session.set('currentGame', undefined))或者关卡不再精彩,订阅就会结束。

其他说明

  • 如果游戏状态变化非常快,我可能值得对其进行评估streams而不是为您的游戏状态使用集合。
  • 做某种 load testing可能需要确定哪种解决方案是最好的。

关于javascript - 是否可以(使用 Meteor)控制何时将发布推送到订阅的客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21515565/

相关文章:

Javascript 最大最小平均

javascript - 添加并选择 "fake"<option> 值到 <select>

javascript - 使用 json 为 Flask-ReSTLess 获取 uri 查询

javascript - vue打印页面,无页脚和页眉

javascript - 从 Meteor js 中的 2 个模板获取输入值

meteor - 带有嵌套 autoValue 的 SimpleSchema 无效键

jquery - 使用 jQuery 定位在 Meteor 中渲染的元素

JavaScript 数组层次结构

android - meteor run 安卓设备停止工作

javascript - 如何使用 Meteor 提供(上传)图像