我想停止订阅过程。
目前这是我的代码:
if (Meteor.isClient) {
Meteor.autorun(function(){
var query;
query = Session.get('search.query');
if (!query) return;
if (Envi.temp.searchSubscribtion) {
console.log('Subscribtion for search has to stop ... ');
Envi.temp.searchSubscribtion.stop();
}
Envi.temp.searchSubscribtion = Meteor.subscribe('search', query, {
onReady : function () {
console.log('Finished.');
}
});
});
}
Env 是一个全局函数,我将订阅临时保存在 temp.searchSubscribtion
中。
现在的问题:我将 search.query
值更改为查询以获取所有项目。大约 1 分钟后将显示完成的 console.log“已完成”。
此后,我将 search.query
更改为仅获取一些项目的查询。大约 5 秒后将显示 Finished console.log。
如您所见:一个长查询和一个小查询。
我现在想做的是:
当查询更改时,当前订阅必须取消,新的订阅必须开始,但是:
当我设置长查询并正确(!)之后,我将 search.query session 更改为小查询,“完成”console.log 在 1 分钟多后显示。
“Envi.temp.searchSubscribtion.stop();
”执行正确(我看到控制台日志),但订阅并没有停止 - 似乎服务器刚刚完成第一次订阅并且比完成第二个 - 就像一个队列。
有什么想法可以取消正在运行的订阅吗?
最佳答案
由于原始查询需要一定时间才能返回,因此运行订阅的单个 Fiber
将停止运行。在完成之前,您将无法向其发送任何其他订阅命令(停止/新订阅等)。
您有几个选择:
- 使查询更快(索引?)
- 发布所有文档[可能限制某些字段],然后在客户端上搜索。然后,您可以通过发送 _id 列表来订阅完整的字段集
- 不要使用发布,并通过
Meteor.methods
发送数据(非响应式/自动发布)。 - 结合 2 和 3;调用一个meteor方法来执行查询,它只返回一个_id列表,然后订阅该
_id
列表 - 除使用服务器端路由外,请执行 (4) 操作,以避免阻塞 Meteor 方法(如果您发出大量方法调用...)
使用 Meteor.methods 时要小心,以避免阻塞纤维,您需要:
- 从客户端调用
Meteor.apply('myMethod',[parameter1,parameter2/* etc */], {wait: false},callback);
- 在服务器上调用方法主体中的
this.unblock()
。
(4) 的示例:
if (Meteor.isServer) {
Meteor.methods('search', function (query) {
this.unblock();
// some query logic??
return _.pluck(collection.find(query, {_id: true}).fetch(), '_id');
});
Meteor.publish('searchResults', function (resultIds) {
return collection.find({_id: {$in: resultIds}});
});
}
if (Meteor.isClient) {
Meteor.autorun(function () {
var query;
query = Session.get('search.query');
if (!query) return;
Meteor.apply('search', [query], {wait:false}, function (err, resultIds) {
if (err) {
console.log('error!', err);
return;
}
var currentSearch = Session.get('search.query');
if (!EJSON.equals(currentSearch, query)) {
console.log('Results returned for', query, ' however current search is ', currentSearch);
return;
}
if (Envi.temp.searchSubscribtion) {
console.log('Subscribtion for search has to stop ... ');
Envi.temp.searchSubscribtion.stop();
}
Envi.temp.searchSubscribtion = Meteor.subscribe('searchResults', resultIds, {
onReady: function () {
console.log('Finished for query:', query);
}
});
});
});
}
关于javascript - meteor js停止订阅集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25582370/