metrojs停止订阅收藏
meteorjs stop subscribtion of collection
我想停止订阅过程。
目前这是我的代码:
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"finished"将在大约1分钟后显示。
在这之后,我将search.query
更改为一个查询,该查询将获得一些项。大约5秒钟后将显示Finished console.log。
如您所见:一个长查询和一个小查询。
我现在想做的是:
当查询发生更改时,必须取消当前的订阅,并且必须启动新的订阅,但是:
当我设置长查询和右(!)之后,我将search.query会话更改为小查询,超过1分钟后将显示"Finished"console.log。
"Envi.temp.searchSubscribtion.stop();
"执行rigth(我看到控制台日志),但susbcrition并没有停止——似乎服务器只是完成了第一次susbcrification,而不是完成第二次susbctrification——就像队列一样。
你知道如何取消正在运行的订阅吗?
因为原始查询需要该时间才能返回,所以运行订阅的单个Fiber
将被搁置。在它完成之前,您将无法向它发送任何其他订阅命令(停止/新订阅等)。
你有几个选择:
- 加快查询速度(索引?)
- 发布所有文档[可能限制某些字段],然后在客户端上搜索。然后,您可以通过发送_id的列表来订阅完整的字段集
- 不要使用发布,而是通过
Meteor.methods
(非响应/自动发布)发送数据 - 联合收割机2&3.调用流星方法来执行查询,该方法只返回id的列表,然后订阅
_id
的列表 - 除了使用服务器端路由外,请执行(4)操作,以避免阻塞流星方法(如果您正在启动大量方法调用…)
使用Meteor.methods以避免阻塞光纤时要小心:
- 来自客户端的
Meteor.apply('myMethod',[parameter1, parameter2 /* etc */], {wait: false}, callback);
调用 - 在方法主体中的服务器调用CCD_ 9上
(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);
}
});
});
});
}
相关文章:
- 使用HTML5 localStorage和jQuery添加到收藏夹/书签
- 连接流星中的两个收藏(帖子评论)
- metrojs persistent设置UserId以切换用户
- 如何从网站获得apple touch图标,如果没有;不存在,则显示收藏夹
- 在玉石模板中显示Mongodb收藏
- 如何获得Backbone.js收藏集只存在于内存中(未持久化)
- Jquery脚本删除表单中的所有项目'的收藏
- 限制收藏-.first-dons'无法使用CompositeViews
- 如何使metrojs反应式froala编辑器在其值更改时进行更新
- "停止运行脚本错误“;在IE8中拥有大量收藏
- 添加到Safari中的收藏夹/书签栏(CMD+D)
- 如何在metrojs中将复选框添加到数据表中
- 角度添加到收藏夹
- Backbone.js加入收藏
- 如何重新运行Meteor出版物以刷新客户端上收藏的内容
- 在metrojs和bootstrap 3中只显示50个字符
- 如何将空白选项添加到木偶收藏视图生成的选择中
- 正在整理流星收藏
- 当你在流星收藏前使用它时,@是什么意思
- metrojs停止订阅收藏