流星 - 为什么我不能在会话中存储我的Meteor.subscribe句柄?我需要稍后才能停止订阅

时间:2014-12-09 17:51:26

标签: meteor publish-subscribe

我有以下代码:

sub_geo = Meteor.subscribe('geo');
console.log('sub_geo returned from Meteor.subscribe: ');
console.log(sub_geo);
Session.set('sub_geo', sub_geo);
console.log('sub_geo retrieved from Session: ');
console.log(Session.get('sub_geo'));

输出如下:

sub_geo returned from Meteor.subscribe:
> Object {stop: function, ready: function}
sub_geo retrieved from Session:
> Object {}

显然我需要存储返回的订阅句柄,因为我需要稍后调用它上面的ready()stop()函数。除了Session之外,还不确定如何存储它。我可以使用全局变量吗?此外 - 即使还有其他方法,为什么这种方法不起作用?

2 个答案:

答案 0 :(得分:1)

它不起作用,因为您只能在会话变量中存储EJSON可序列化对象。如果您需要当前文件之外的订阅句柄,则需要将其存储在全局变量中(可能在Subscriptions之类的命名空间下 - 例如,请参阅richsilv对this question的回答。

答案 1 :(得分:0)

你实际上可以做到这一点,但不是你想象的那样。 只需像你一样设置会话:

Session.set('sub_geo', sub_geo);

然后,如果您想对订阅执行某些操作,请从Meteor自己的注册表中检索句柄:

const handle = Meteor.default_connection._subscriptions[Session.get('sub_geo').subscriptionId]

如果你打算使用Session(不鼓励,除非你真的需要),清理它:

delete Session.keys['sub_geo'];

目前我在Meteor 1.3.3.1中运行良好,但也可能适用于大多数以前的版本。

PS:会话的替代方案是Reactive Var和Reactive Dict。