我希望将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()
句柄,则代码可以正常工作。
那么,我可以不停止手柄或者会给我一个内存泄漏吗?或者我该如何保持两个Meteor集合同步?
答案 0 :(得分:2)
您可以使用matb33:collection-hooks
收听对集合的更新。这将是服务器端:
Settings.after.update(function(userId, doc, fieldNames, modifier, options){
var insert = {};
//...your logic
ServiceConfiguration.configurations.update({service: "xmpp"}, insert);
});
答案 1 :(得分:1)
TL / DR - 是的,您可以将其删除。
如果我理解正确,这种情况下,多个用户可以订阅“设置”发布,可能会更改“设置”集合中的设置,您需要自动将这些设置传播到ServiceConfiguration集合。
如果是这种情况,那么您不应该试图阻止观察者,因为它是一个全局构造,旨在监视任何用户的所有更改。您需要停止发布关闭的观察者的情况是观察者从在发布函数中运行,因此为每个连接的用户生成了一个新的。如果你在这种情况下没有停止观察者,同一个用户可能会反复连接和断开连接,你可能会有无限数量的正在运行的观察者,你的应用程序就会死亡。
但是,在这里,您只能拥有一个观察者,该观察者的运行与订阅客户端的数量无关。此外,当任何单个出版物停止时,您无法阻止它,因为可能仍有其他客户订阅者可以继续进行更改。
总之,删除onStop
块很好。如果这没有意义,请告诉我。