我有一个应该是一个相对简单的问题。我设置了一个会话,然后使用存储在会话中的字符串订阅集合。但是当该会话发生变化时,我需要清除订阅数据并重新开始。
我的代码如下:
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
方法。那么我就跑了。但是,它实际上并没有阻止任何事情。
我错过了什么?
答案 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();
}
});