Meteor onConnection客户端端挂钩?

时间:2017-03-31 17:37:17

标签: javascript meteor

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

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

Meteor.subscribe('Members', fnGetLastEvent());

我试图在Meteor重新连接挂钩上重新加载它(如果存在的话)。 提前致谢。

1 个答案:

答案 0 :(得分:2)

我没有为您提供直接的答案,但您可以尝试查看这些内容是否适合您的特定用例。

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

Meteor.onReconnect = function() {
  console.log("meteor has reconnected);
  // do stuff
};

我在我的Meteor应用程序的控制台中从Chrome开发人员工具中测试了这一点。我设置了onReconnect回调,运行了Meteor.disconnect(),然后运行了Meteor.reconnect()并且我的回调被解雇了。唯一需要注意的是,我不确定此回调是否在 建立连接后运行 之前。

2)将subscribe电话放在使用autorun作为被动数据源的Meteor.status()内。我在我的一个应用程序中进行了类似的检查,以检查Meteor是否未连接,然后显示一个模式,通知用户他们的数据不再是实时的。以下是我用来检测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)这个只是理论上的。您似乎应该能够在Session中存储订阅参数,并将订阅逻辑放在autorun内。重新连接后,理论上的autorun应该再次运行。假设这是某个模板的内部,那么它看起来就像这样。

this.autorun(() => {
  this.subscribe('Members', Session.get('sub_params'));
});

4)您可以在client Meteor.connection._stream object上设置一些可能使用的回调。可用选项位于messageresetdisconnect。我之前在message上使用过回调进行调试(见下文)。

Meteor.connection._stream.on('message', function (message) {
  console.log("receive", JSON.parse(message));
});

假设在重新建立连接时触发reset,那么您可以将订阅逻辑放在那里。

Meteor.connection._stream.on('reset', function () {
  // subscription logic here
});
祝你好运!