如何知道Meteor Collection Subscription是否没有变化。 [流星+火焰]

时间:2018-04-24 12:37:46

标签: meteor meteor-blaze

以下是用户界面上的订阅。

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 Subscription仍未受影响且未在UI上更改其数据?订阅数据不变时是否会触发任何标志或其他内容?

1 个答案:

答案 0 :(得分:1)

自动运行,ReactiveVar和订阅

在您的代码示例中,订阅本身将重新运行服务器的发布函数,因为订阅的输入变量email取决于反应变量validEmail,从而触发autorun更改时validEmail

您可以通过在出版物中将某些内容记录到控制台来轻松检查服务器控制台上的内容。

如果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一起存储。如果在新订阅后文档的哈希值不同,您可以假定更改与此文档相关。

一般说明

  • 散列是一种昂贵的操作,因此可能难以跟上大型集合的性能
  • 通常你应该以输入改变输出变化的方式设计你的pub / sub和autorun
  • 代码是冷写的,所以它可能无法开箱即用。如果没有,请告诉我。