Javascript 保持两个流星收集同步
我想使Javascript 保持两个流星收集同步,javascript,meteor,Javascript,Meteor,我想使ServiceConfiguration集合与设置集合保持同步。我已经(几乎)用observeChanges完成了这项工作,比如: var handle = Settings.find().observeChanges({ changed: function (id, post) { var insert = {}; post.hostName && (insert.host = post.hostName); pos
ServiceConfiguration
集合与设置集合保持同步。我已经(几乎)用observeChanges
完成了这项工作,比如:
var handle = Settings.find().observeChanges({
changed: function (id, post) {
var insert = {};
post.hostName && (insert.host = post.hostName);
post.domainName && (insert.domain = post.domainName);
ServiceConfiguration.configurations.update({service: "xmpp"}, insert);
}
});
Meteor.publish("Settings", function() {
this.onStop = function () {
handle.stop();
};
return Settings.find();
});
但是,这段代码的问题是,在客户端断开连接时,不会直接调用出版物的onStop
方法。我使用该回调的原因是Meteor文档强调了手动取消observeChanges
句柄的重要性,但如果我以这种方式取消它,那么我实际上无法观察到集合的更改。但是,如果我不stop()
handle,代码就可以正常工作
所以,我不能停止手柄,或者这会导致内存泄漏吗?或者我应该如何保持两个流星收集同步?TL/DR-是的,您可以删除它 如果我理解正确,在这种情况下,多个用户可以订阅“设置”发布,可能会更改设置集合中的设置,并且您需要将这些设置自动传播到ServiceConfiguration集合 如果是这种情况,那么您不应该试图阻止观察者,因为它是一个全局构造,用于监视任何用户的所有更改。您需要停止obsever on publication closure的情况是从publish函数中运行obsever,因此会为每个连接的用户生成一个新的obsever。如果你在这种情况下不停止观察者,那么同一个用户可能会反复连接和断开连接,你可能会有无限数量的观察者在运行,你的应用程序也会死掉 然而,在这里,您将只有一个观察者,它独立于订阅客户端的数量运行。此外,当任何单个发布被停止时,您不能停止它,因为可能还有其他客户端订阅者可以继续进行更改
总之,可以删除
onStop
块。如果没有意义,请告诉我。您可以使用matb33:collection hooks
侦听集合的更新。这将是服务器端:
Settings.after.update(function(userId, doc, fieldNames, modifier, options){
var insert = {};
//...your logic
ServiceConfiguration.configurations.update({service: "xmpp"}, insert);
});
退房