是否值得在Meteor中批量订阅?

时间:2016-02-05 17:34:24

标签: performance meteor publish-subscribe

当显示文档列表时,如果模板在其他地方重用,则可以更清楚地在文档级别(列表级别)编写订阅。效率低下还是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是基于套接字的,并且很好地处理了许多事情,我想知道将一些逻辑从文档移到列表中是值得的。

1 个答案:

答案 0 :(得分:1)

通常最好拨打一次订阅。当您使用new params运行subscribe时,重新运行publish方法,然后调用db来获取所需的文档并将其发送到客户端。通常只对db进行一次调用会更好,更有效。

但是,如果您确定要显示所有项目以及Items集合中的项目不是太多,这是有道理的。

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