metrojs停止订阅收藏

meteorjs stop subscribtion of collection

本文关键字:收藏 metrojs      更新时间:2023-09-26

我想停止订阅过程。

目前这是我的代码:

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

你有几个选择:

  1. 加快查询速度(索引?)
  2. 发布所有文档[可能限制某些字段],然后在客户端上搜索。然后,您可以通过发送_id的列表来订阅完整的字段集
  3. 不要使用发布,而是通过Meteor.methods(非响应/自动发布)发送数据
  4. 联合收割机2&3.调用流星方法来执行查询,该方法只返回id的列表,然后订阅_id的列表
  5. 除了使用服务器端路由外,请执行(4)操作,以避免阻塞流星方法(如果您正在启动大量方法调用…)

使用Meteor.methods以避免阻塞光纤时要小心:

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