代码之家  ›  专栏  ›  技术社区  ›  Ankur Soni

如何知道Meteor Collection订阅是否没有更改。[流星+火焰]

  •  1
  • Ankur Soni  · 技术社区  · 7 年前

    下面是UI上的订阅。

    Template.AssociateEmp.onCreated(function(){
        this.validEmail = new ReactiveVar('');
    
        const tpl = this;
        this.autorun(() => {
            var email = this.validEmail.get();
            this.subscribe('GetUnassociatedUser', email, {
                onReady: function () {},
                onError: function () {}
              });
        });
    });
    

    有没有办法知道即使动态数据发生了变化(此处 validEmail ),Meteor订阅未受影响,并且未更改其UI上的数据?订阅数据未更改时是否有任何标志或触发的内容?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Community CDub    4 年前

    自动运行、反应变量和订阅

    在代码示例中,订阅本身将作为订阅的输入变量重新运行服务器的发布函数 email 取决于无功变量 validEmail 从而触发 autorun 什么时候 有效电子邮件 更改。

    通过在发布中的控制台上记录一些内容,可以在服务器控制台上轻松检查这一点。

    如果 有效电子邮件 保持不变,没有理由 自动运行 触发(除非有其他可能未添加到代码示例中的反应源)。


    订阅的数据如何

    现在,如果某个原因导致订阅重新运行,并且您想知道集合的数据是否已更改,那么您可以轻松地检查 collection.count() 但这可能有缺陷。

    假设您的发布被参数化,以通过不同的参数包含不同的字段,那么传输到客户端集合的数据将不同。

    然后需要一种方法来检查客户端集合的数据完整性。


    使用哈希验证完整性

    一个可能的帮助是使用 sha 包裹

    例如,您可以为整个集合创建一个哈希:

    // get data
    const data = Collection.find().fetch();
    
    // map data to strings
    // and reduce to one string
    const hashInput = data.map(doc => JSON.stringify(doc) ).reduce((a, b) => a + b);
    
    // generate hash
    const collectionHash = SHA256(hashInput);
    

    下一个之后 onReady 您可以生成集合的新哈希,并将其与以前的哈希进行比较。如果他们不一样,那么有些事情已经改变了。

    如果您只想知道数据是否已更改,而不想显示哪个文档已更改,那么也无需迭代集合的文档。


    散列单个文档

    散列单个文档可以让您更深入地了解发生了什么变化。为此,您只需创建集合哈希的映射:

    // get data
    const data = Collection.find().fetch();
    
    // map data to strings
    const hashes = data.map(doc => { _id: doc._id, hash: SHA256( JSON.stringify(doc) ) });
    

    您可以将这些哈希值与文档的 _id 。如果新订阅后文档的哈希值不同,则可以假定更改与此文档相关。

    一般注释

    • 哈希是一种昂贵的操作,因此可能很难在大型集合上保持性能
    • 通常,在设计发布/订阅和自动运行时,应确保输入更改时输出更改
    • 代码是冷写的,因此可能无法开箱即用。如果有问题,请告诉我。