meteor js停止收集订阅

时间:2014-08-30 12:28:34

标签: 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值更改为查询以获取所有项目。完成的console.log"已完成"大约1分钟后显示。

在此之后,我将search.query更改为jsut获取一些项目的查询。大约5秒后显示完成的console.log。

如您所见:长查询和小查询。

我现在想做的是:

当查询被更改时,当前订阅必须是取消并且新订阅必须开始,但是:

当我设置长查询并在此之后右(!)之后,我将search.query会话更改为小查询"已完成" console.log超过1分钟后显示。

" Envi.temp.searchSubscribtion.stop();"执行rigth(我看到控制台日志)但是susbcribtion并没有停止 - 看起来服务器只是完成了第一个susbcribtion而不是完成第二个 - 就像一个队列。

如何取消正在运行的订阅?

1 个答案:

答案 0 :(得分:1)

由于原始查询需要花费该时间才能返回,因此运行订阅的单个Fiber将被停用。在完成之前,您将无法向其发送任何其他订阅命令(停止/新订阅等)。

您有几个选择:

  1. 加快查询速度(索引?)
  2. 发布所有文档[可能限制某些字段],然后在客户端上搜索。然后,您可以通过发送_id'
  3. 列表来订阅完整的字段集
  4. 不要使用出版物,并通过Meteor.methods发送数据(非反应/自动发布)。
  5. 结合2& 3;调用meteor方法进行查询,只返回_id的列表,然后订阅_id
  6. 的列表
  7. 做(4)除了使用服务器端路由,以避免阻塞流星方法(如果你开始大量的方法调用......)。
  8. 使用Meteor.methods时要小心,以避免阻挡你需要的纤维:

    1. 来自客户的电话Meteor.apply('myMethod',[parameter1, parameter2 /* etc */], {wait: false}, callback);
    2. 在方法正文中的服务器调用this.unblock()上。
    3. (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);
              }
            });
          });
        });
      
      }