Javascript Meteor onConnection客户端挂钩?

Javascript Meteor onConnection客户端挂钩?,javascript,meteor,Javascript,Meteor,Meteor上客户端是否有onConnection钩子?这是我的问题: 我试图检测Meteor重新连接到服务器的任何时间,以便根据参数以编程方式重新订阅某些数据 Meteor实际上会自动重新订阅我的默认订阅,但我还有一个基于参数的Global订阅,在重新连接后不会重新加载: Meteor.subscribe('Members', fnGetLastEvent()); 我想把它装在流星重联钩上,如果它存在的话。 提前谢谢 我没有一个直接的答案给你,但是这里有一些东西你可以试着看看它们是否适合你的

Meteor上客户端是否有onConnection钩子?这是我的问题: 我试图检测Meteor重新连接到服务器的任何时间,以便根据参数以编程方式重新订阅某些数据

Meteor实际上会自动重新订阅我的默认订阅,但我还有一个基于参数的Global订阅,在重新连接后不会重新加载:

Meteor.subscribe('Members', fnGetLastEvent());
我想把它装在流星重联钩上,如果它存在的话。
提前谢谢

我没有一个直接的答案给你,但是这里有一些东西你可以试着看看它们是否适合你的特定用例

1) 在客户端设置自己的
onReconnect
回调函数

Meteor.onReconnect = function() {
  console.log("meteor has reconnected);
  // do stuff
};
我在一个Meteor应用程序的控制台上用Chrome开发者工具测试了这一点。我设置了
onReconnect
回调,运行了
Meteor.disconnect()
,然后运行了
Meteor.reconnect()
,我的回调启动了。唯一需要注意的是,我不确定此回调是在连接建立之后运行还是在连接建立之前运行

2) 将您的
subscribe
调用放入使用
Meteor.status()
作为反应数据源的
autorun
中。我在我的一个应用程序中做了一个类似的检查,检查Meteor是否未连接,然后显示一个模式,通知用户他们的数据不再是实时的。这里是我用来检测流星何时断开连接与何时重新连接的主要逻辑

var updateCountdownTimeout;
var nextRetry = new ReactiveVar(0);

Tracker.autorun(() => {
  if (Meteor.status().status === 'waiting') {
    updateCountdownTimeout = Meteor.setInterval(() => {
      nextRetry.set(Math.round((Meteor.status().retryTime - (new Date()).getTime()) / 1000));
    }, 1000);
  } else {
    nextRetry.set(0);
    Meteor.clearInterval(updateCountdownTimeout);
  }

  if (!Meteor.status().connected && Meteor.status().status !== 'offline' && Meteor.status().retryCount > 0) {
    console.log("Connection to server has been LOST!");
  } else {
    console.log("Connection to server has been RESTORED!");
    // put subscription logic here
  }
});
这里的警告是,我不确定第一次加载应用程序时会发生什么。我不确定你的订阅逻辑是否会运行,或者它是否只会在重新连接之后运行(你可以测试一下)

3) 这只是理论上的。似乎您应该能够将订阅参数存储在
会话中
,并将订阅逻辑放入
自动运行中
。重新连接后,
自动运行理论上应再次运行。假设这是在模板的某个地方,那么它看起来是这样的

this.autorun(() => {
  this.subscribe('Members', Session.get('sub_params'));
});
4) 您可以在上设置一些回调,这些回调可能会用到。可用选项包括
消息
重置
断开
。我以前在
消息
上使用过回调进行调试(见下文)

假设在重新建立连接时启动了on
reset
,那么您可能可以将订阅逻辑放在那里

Meteor.connection._stream.on('reset', function () {
  // subscription logic here
});

祝你好运

您能否将全局订阅参数存储在
会话中
并在订阅中使用它(您的订阅需要包装在
自动运行中
)。我很确定Meteor会在重新连接时重新运行所有依赖于反应数据源的反应计算(例如,
会话
)。值得一试。你又做了一次@jordanwillis!我试过你的第四种选择,现在可以了,谢谢!这是我的代码(当重新连接发生时,我只在特定路由中重新订阅,否则我在切换路由时重新订阅):
Meteor.connection.\u stream.on('reset',function(){if(Router.current().route.getName()=“eventContainer.:\u id”){alert(“重新连接.准备订阅:”+Router.current().params._id);Meteor.subscribe('Members',Router.current().params._id);})对这个@jordanwillis有什么想法吗?=)看看我提交的关于这个问题的答案。
Meteor.connection._stream.on('reset', function () {
  // subscription logic here
});