Подписка на Метеор не прекращается

У меня есть то, что должно быть относительно простой проблемой. Я устанавливаю сеанс, затем подписываюсь на коллекцию, используя строку, хранящуюся в сеансе. Но когда этот сеанс изменится, мне нужно очистить данные подписки и начать заново.

Мой код выглядит следующим образом:

let subscriptionReady;
let filteredResults = [];
let rawResults = [];
let county = Session.get('county');
let type = Session.get('type');

В основном это просто подготовительная работа по созданию пустых объектов для последующего заполнения. Все это устанавливается в событии клика. После того, как мы установим эти объекты-заполнители, мы идем и подписываемся на эти сеансы:

  if (county && !type) {
    return function() {
      if (subscriptionReady) {
        subscriptionReady.stop();
      }

      filteredResults = [];
      rawResults = [];

      subscriptionReady = Meteor.subscribe('resourcesearch', county, {
        onReady: () => {
          rawResults = resourceCollection.find({}, { sort: {score: -1} }).fetch();

          rawResults.forEach((result) => {
            if (result.score) {
              filteredResults.push(result);
            }
          });
        }
      });
    }

В третьей строке я запускаю проверку, существует ли subscriptionReady, тогда будет доступен метод stop. Тогда я запускаю его. Но на самом деле это ничего не останавливает.

Что мне не хватает?


person thatgibbyguy    schedule 06.08.2017    source источник


Ответы (2)


После проб и ошибок я решил эту проблему. Проблема заключалась в размещении стоп-колла. Мне больше не нужно проверять, существует ли subscriptionReady, вместо этого я останавливаю подписку внутри метода onReady:

    return function() {
      filteredResults = [];
      rawResults = [];

      subscriptionReady = Meteor.subscribe('resourcesearch', county, {
        onReady: () => {
          rawResults = resourceCollection.find({}, { sort: {score: -1} }).fetch();

          rawResults.forEach((result) => {
            if (result.score) {
              filteredResults.push(result);
            }
          });            

          subscriptionReady.stop();
        }
      });
person thatgibbyguy    schedule 06.08.2017
comment
Почему вы решаете все эти проблемы вместо того, чтобы получать правильные данные с помощью метода? - person tomsp; 07.08.2017
comment
На самом деле это отличное предложение. Наверное, потому что я давно не работал в метеоре. - person thatgibbyguy; 09.08.2017
comment
На самом деле, вы настоящий MVP для этого комментария. Мой ответ правильный, но ваше предложение лучше. Благодарю вас! - person thatgibbyguy; 09.08.2017

Это .stop() не .stop документы

Также вы, вероятно, можете избежать цикла фильтрации, включив score в свой запрос. Вы ищете документы, в которых ключ score существует {score: {$exists: true}} или просто не равен нулю {$score: {$ne: 0}}?

Также вам не нужно очищать подписку и начинать заново. Если вы сделаете параметр подписки resourcesearch реактивным источником данных, подписка автоматически обновится, чтобы предоставить вам необходимые документы. Запуск/остановка подписки в ответ на поиск был бы антишаблоном.

person Michel Floyd    schedule 06.08.2017
comment
Я неправильно скопировал, на самом деле я использую stop(). Сообщение обновлено, чтобы отразить это. - person thatgibbyguy; 06.08.2017