【问题标题】:Meteor subscription is not stoppingMeteor 订阅不会停止
【发布时间】:2017-08-06 18:33:24
【问题描述】:

我有一个相对简单的问题。我设置了一个会话,然后使用存储在会话中的字符串订阅一个集合。但是当该会话发生变化时,我需要清除订阅数据并重新开始。

我的代码如下:

let subscriptionReady;
let filteredResults = [];
let rawResults = [];
let county = Session.get('county');
let type = Session.get('type');

这主要是创建一些空对象以供以后填充的准备工作。这一切都设置在点击事件上。在我们设置这些占位符对象后,我们去订阅这些会话:

  if (county && !type) {
    return function() {
      if (subscriptionReady) {
        subscriptionReady.stop();
      }

      filteredResults = [];
      rawResults = [];

      subscriptionReady = Meteor.subscribe('resourcesearch', county, {
        onReady: () => {
          rawResults = resourceCollection.find({}, { sort: {score: -1} }).fetch();

          rawResults.forEach((result) => {
            if (result.score) {
              filteredResults.push(result);
            }
          });
        }
      });
    }

在第三行,我运行检查subscriptionReady 是否存在,那么它将有stop 方法可用。然后我运行它。但是,它实际上并没有停止任何事情。

我错过了什么?

【问题讨论】:

    标签: meteor subscription


    【解决方案1】:

    经过反复试验,我已经解决了。问题是停止呼叫的位置。我不再需要检查 subscriptionReady 是否存在,而是在 onReady 方法中停止订阅:

        return function() {
          filteredResults = [];
          rawResults = [];
    
          subscriptionReady = Meteor.subscribe('resourcesearch', county, {
            onReady: () => {
              rawResults = resourceCollection.find({}, { sort: {score: -1} }).fetch();
    
              rawResults.forEach((result) => {
                if (result.score) {
                  filteredResults.push(result);
                }
              });            
    
              subscriptionReady.stop();
            }
          });
    

    【讨论】:

    • 您为什么要经历所有这些麻烦而不是使用方法获取正确的数据?
    • 这实际上是一个很好的建议。可能是因为我很久没有在流星工作了。
    • 其实,你才是这条评论的真正MVP。我的回答是正确的,但你的建议更好。谢谢!
    【解决方案2】:

    .stop() 不是.stop docs

    您还可以通过在查询中包含score 来避免过滤循环。您是在寻找存在score{score: {$exists: true}} 还是非零{$score: {$ne: 0}} 的文档?

    此外,您不需要清除订阅并重新开始。如果您将订阅参数resourcesearch 设为响应式数据源,那么订阅将自动更新以提供您需要的文档。响应搜索启动/停止订阅将是一种反模式。

    【讨论】:

    • 我复制错了,我实际上使用的是stop()。帖子已更新以反映这一点。
    猜你喜欢
    • 2016-09-17
    • 1970-01-01
    • 2017-04-10
    • 2017-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多