流星订阅并没有停止

时间:2017-08-06 18:33:25

标签: meteor subscription

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

我的代码如下:

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

这主要是准备创建一些空对象以便稍后填充的准备工作。这一切都在click事件中设置。在我们设置这些占位符对象后,我们将按这些会话进行订阅:

  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方法。那么我就跑了。但是,它实际上并没有阻止任何事情。

我错过了什么?

2 个答案:

答案 0 :(得分:0)

它是.stop()而不是.stop docs

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

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

答案 1 :(得分:0)

经过反复试验,我已经解决了问题。问题是停止呼叫的放置。我不再需要检查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();
        }
      });