【问题标题】:Keep two Meteor collections in sync保持两个 Meteor 集合同步
【发布时间】:2015-01-21 17:38:52
【问题描述】:

我想让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 集合保持同步?

【问题讨论】:

    标签: javascript meteor


    【解决方案1】:

    您可以使用matb33:collection-hooks 监听集合的更新。这将是服务器端:

    Settings.after.update(function(userId, doc, fieldNames, modifier, options){
        var insert = {};
        //...your logic
        ServiceConfiguration.configurations.update({service: "xmpp"}, insert);
    });
    

    查看https://github.com/matb33/meteor-collection-hooks

    【讨论】:

      【解决方案2】:

      TL/DR - 是的,您可以删除它。

      如果我理解正确,这是多个用户可以订阅“设置”发布的情况,可能会更改设置集合中的设置,并且您需要自动将这些传播到 ServiceConfiguration 集合。

      如果是这种情况,那么您不应该尝试停止观察者,因为它是一个旨在监控任何用户的所有更改的全局构造。您需要在发布关闭时停止观察者的情况是当观察者从发布函数运行时,因此会为每个连接的用户生成一个新的观察者。如果您在这种情况下没有停止观察者,则同一用户可能会反复连接和断开连接,并且您可能会留下无限数量的正在运行的观察者,并且您的应用将会死机。

      但是,在这里,您将永远只有一个观察者,它独立于订阅客户端的数量运行。此外,您无法在任何单独的发布停止时停止它,因为可能仍有其他客户端订阅者可以继续进行更改。

      总而言之,删除onStop 块很好。如果这没有意义,请告诉我。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-26
        • 2011-12-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多