我想停止订阅过程。
目前这是我的代码:
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
值更改为查询以获取所有项目。完成的console.log"已完成"大约1分钟后显示。
在此之后,我将search.query
更改为jsut获取一些项目的查询。大约5秒后显示完成的console.log。
如您所见:长查询和小查询。
我现在想做的是:
当查询被更改时,当前订阅必须是取消并且新订阅必须开始,但是:
当我设置长查询并在此之后右(!)之后,我将search.query会话更改为小查询"已完成" console.log超过1分钟后显示。
" Envi.temp.searchSubscribtion.stop();
"执行rigth(我看到控制台日志)但是susbcribtion并没有停止 - 看起来服务器只是完成了第一个susbcribtion而不是完成第二个 - 就像一个队列。
如何取消正在运行的订阅?
答案 0 :(得分:1)
由于原始查询需要花费该时间才能返回,因此运行订阅的单个Fiber
将被停用。在完成之前,您将无法向其发送任何其他订阅命令(停止/新订阅等)。
您有几个选择:
Meteor.methods
发送数据(非反应/自动发布)。_id
使用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);
}
});
});
});
}