使用 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);
}
});
我在这里使用 excitingLevel
和 currentGame
(难道没有游戏在进行吗?)来激活订阅。另请注意,autorun
足够聪明,可以在不再满足条件时停止 订阅。所以如果玩家离开游戏(Session.set('currentGame', undefined)
)或者关卡不再精彩,订阅就会结束。
其他说明
- 如果游戏状态变化非常快,我可能值得对其进行评估streams而不是为您的游戏状态使用集合。
- 做某种 load testing可能需要确定哪种解决方案是最好的。
关于javascript - 是否可以(使用 Meteor)控制何时将发布推送到订阅的客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21515565/