Meteor上的客户端是否有onConnection挂钩?这是我的问题: 我试图随时检测Meteor重新连接到服务器,以编程方式根据参数重新订阅某些数据。
Meteor实际上会自动重新订阅我的默认订阅,但我还有一个基于参数的全球订阅,重新连接后不会重新加载:
Meteor.subscribe('Members', fnGetLastEvent());
我试图在Meteor重新连接挂钩上重新加载它(如果存在的话)。 提前致谢。
答案 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上设置一些可能使用的回调。可用选项位于message
,reset
和disconnect
。我之前在message
上使用过回调进行调试(见下文)。
Meteor.connection._stream.on('message', function (message) {
console.log("receive", JSON.parse(message));
});
假设在重新建立连接时触发reset
,那么您可以将订阅逻辑放在那里。
Meteor.connection._stream.on('reset', function () {
// subscription logic here
});
祝你好运!