2017-08-06 159 views
0

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

我的代码如下:

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方法。然后我运行它。但是,它并不能阻止任何事情。

我缺少什么?

回答

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(); 
     } 
     }); 
+1

为什么你会经历所有这些麻烦,而不是用一种方法获取正确的数据? – tomsp

+0

这实际上是一个很棒的建议。可能是因为我很长一段时间没有在流星工作过。 – thatgibbyguy

+1

其实,你是这个评论的真正的mvp。我的回答是正确的,但你的建议更好。谢谢! – thatgibbyguy

0

.stop().stopdocs

您也可以通过可能包括在查询score避免你的过滤环。您是否正在寻找score密钥存在的文档{score: {$exists: true}}或者它是否为非零{$score: {$ne: 0}}

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

+0

我抄错了,我实际使用'停止()'。发布更新以反映这一点。 – thatgibbyguy