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

How to know if Meteor Collection Subscription did not change. [Meteor + Blaze]

以下是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 上的数据?当订阅数据不变时,是否有任何标志或触发的东西?

自动运行、ReactiveVar 和订阅

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

您可以通过在出版物中向控制台记录一些内容来轻松地在您的服务器控制台上进行检查。

如果 validEmail 保持不变,则 autorun 没有理由触发(除非有其他反应源可能不会添加到您的代码示例中)。


订阅的数据呢

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

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

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


使用散列来验证完整性

一个可能的帮助是使用 sha 包从数据集中生成 hases。

例如,您可以为整个集合创建一个散列:

// 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 和 auto运行 当输入改变时输出改变
  • 代码是冷写的,因此它可能无法开箱即用。如果没有,请告诉我。