流星订阅不会停止

Meteor subscription is not stopping

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

我的代码如下:

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方法可用。那我就运行吧。但是,它实际上并没有阻止任何事情。

我错过了什么?

.stop()不是.stopdocs

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

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

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