明确停止订阅

时间:2018-11-17 15:36:01

标签: reactjs meteor meteor-react

在我的Meteor应用程序中,我有一个出版物,该出版物可能会也可能不会发布大量文档。通常,出版物会发布多达数百个的任意数量的文档。但是,这些文档由用户添加,并且用户可以添加的数量没有限制。因此,从理论上(在实践中的某个时候),用户可以拥有成千上万,成千上万甚至数十万的文档。

尽管我使用分页仅显示少量文档,但是该出版物是一个自定义出版物,它结合了多个集合的数据,因此分页,过滤以及排序都在查询中进行:

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

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

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

  

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

因此,我希望使用这样的方法可以解决问题:

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

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

有什么办法可以过早取消客户端的订阅?

1 个答案:

答案 0 :(得分:0)

我相信您有一个设计问题,您的Meteor.subscribe('myLargePublication');可以接受另一种控制Meteor.publish行为的扩充功能,因此您可以一次发送10个文档,也可以返回一组基于在用户搜索中。

不用说,发布数百个文档是不合理的,因为这将影响服务器/客户端的性能,因为您正在使用React,因此当组件卸载时,订阅将停止。

您可以检查一些库,这些库可能会根据您的情况提供帮助

Reactive subscription(当参数传递给Meteor.publish时,不会从头开始重新启动订阅)

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