javascript - meteor js停止订阅集合

标签 javascript meteor

我想停止订阅过程。

目前这是我的代码:

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/

相关文章:

javascript - Meteor.js 根据用户 ID 仅向一名用户发布

Meteor:将多个 javascript 文件聚合为一个?

node.js - 使用 Fiber 的远程方法出现 Meteor EADDRINUSE 异常

javascript - 响应式砌体布局问题

javascript - React 在小于号之前给出错误

javascript - 防止重复插入文档

node.js - "meteor run --production"与 MONGO_URL 与捆绑

javascript - 如何在 React 中限制表格高度并将滚动条附加到表格主体?

javascript - 在 Node.js 中的两个独立运行的进程之间发送消息

javascript - Node 中的箭头函数提升?