2017-08-06 157 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