首页 > 解决方案 > 明确停止订阅

问题描述

在我的 Meteor 应用程序中,我有一个出版物,它可能会或可能不会发布大量文档。通常,该出版物发布任何数量的文档,最多几百个。但是,这些文档是由用户添加的,用户可以添加的数量没有限制。因此,理论上(以及在实践中的某个时刻)用户可以拥有数千、数万甚至数十万的文档,这些文档将使用此出版物发布。

虽然我使用分页只显示少量文档,但发布是一个自定义发布,它连接了多个集合的数据,因此分页、过滤和排序都发生在查询中:

const subscription = Meteor.subscribe('myLargePublication');
const documents = MyLargePublication.find({ query }, { skip, limit, sort });

无论文档数量如何,这都可以正常工作。但是,我遇到的问题是,如果用户进入此视图,然后立即路由到另一个视图,则所有后续订阅都将被阻止,直到myLargePublication下载所有数据。

#subscribe 上的流星文档中,我认为有一个函数stop()可以在订阅的处理程序上调用

取消订阅。这通常会导致服务器指示客户端从客户端的缓存中删除订阅的数据。

因此,我希望使用这样的东西可以解决这个问题:

componentWillUnmount() {
    const { subscription } = this.props;
    subscription.stop()
}

查看this.onStop(() => { ... })我出版物中的日志并没有发现任何有用的见解。在这种情况下,这个函数似乎根本没有做任何事情,我觉得要解决我的问题,我必须更改我的发布/订阅。

有什么办法可以提前取消客户的订阅?

标签: reactjsmeteormeteor-react

解决方案


我相信您有一个设计问题,您Meteor.subscribe('myLargePublication');可以接受另一个控制 的行为的增强Meteor.publish,因此您可以一次发送 10 个文档,或者根据用户搜索返回一组文档。

不用说,发布数百个文档是不合理的,这会影响服务器/客户端的性能,话虽如此,由于您使用的是 React,当组件卸载时订阅应该停止。

您可以查看一些可能对您的情况有所帮助的库

反应式订阅(当参数传递给 Meteor.publish 时,不会从头开始重新开始订阅)

Tracker - 组件(组件卸载时停止订阅)


推荐阅读