在 Meteor 中批量订阅值得吗?

Is it worth batching subscriptions in Meteor?

显示文档列表时,在文档级别(相对于列表级别)编写订阅会更清楚,以防模板在其他地方重复使用,例如。是效率较低还是 Meteor 处理事情很神奇?

更准确地说,我可以将文档逻辑放在文档模板中:

Template.itemsList.helpers({
  items: function() {
    return this.itemsIds.map(function(id) { return { _id: id }; });
  },
});

<template name="itemsList">
  {{#each items}}{{> item}}{{/each}}
</template>


Template.item.onCreated(function() {
  this.subscribe('item', this.data._id);
});

<template name="item">
  {{#if Template.subscriptionsReady}}
    ...
  {{/if}}
</template>

或仅订阅列表级别的这些文档一次:

Template.itemsList.onCreated(function() {
  this.subscribe('items', this.data.itemsIds);
});

Template.itemsList.helpers({
  items: function() {
    return Items.find({_id: {$in: this.itemsIds}});
  },
});

<template name="itemsList">
  {{#if Template.subscriptionsReady}}
    {{#each items}}{{> item}}{{/each}}
  {{/if}}
</template>

<template name="item">
  ...
</template>

看起来第二种方法更有效,因为只有一次订阅调用。如果我们在这里讨论标准的 http 请求,那就毫无疑问了。但由于 Meteor 是基于套接字的,并且可以很好地处理很多事情,我想知道将一些逻辑从文档移到列表中是值得的。

一般调用一次subscribe比较好。当您 运行 使用新参数订阅发布方法 re-运行s 时,它会调用 db 以获取所需的文档并将其发送给客户端。通常只调用一次 db 会更好、更高效。

但是,如果您确定要显示所有项目并且 Items 集合中的项目不多,这就有意义了。

如果有大量项目(数百个或更多),最好进行某种分页以避免将所有文档下载到客户端。