gpt4 book ai didi

javascript - meteor js停止订阅集合

转载 作者:行者123 更新时间:2023-12-03 11:56:46 25 4
gpt4 key购买 nike

我想停止订阅过程。

目前这是我的代码:

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 将停止运行。在完成之前,您将无法向其发送任何其他订阅命令(停止/新订阅等)。

您有几个选择:

  1. 使查询更快(索引?)
  2. 发布所有文档[可能限制某些字段],然后在客户端上搜索。然后,您可以通过发送 _id 列表来订阅完整的字段集
  3. 不要使用发布,并通过 Meteor.methods 发送数据(非响应式/自动发布)。
  4. 结合 2 和 3;调用一个meteor方法来执行查询,它只返回一个_id列表,然后订阅该_id列表
  5. 除使用服务器端路由外,请执行 (4) 操作,以避免阻塞 Meteor 方法(如果您发出大量方法调用...)

使用 Meteor.methods 时要小心,以避免阻塞纤维,您需要:

  1. 从客户端调用 Meteor.apply('myMethod',[parameter1,parameter2/* etc */], {wait: false},callback);
  2. 在服务器上调用方法主体中的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com