Подписка в Tracker.autorun приводит к многократному срабатыванию обратного вызова публикации - PullRequest
0 голосов
/ 22 мая 2019

Я работаю в проекте ReactJS и Meteor и обнаружил странное поведение, которое я опишу здесь:

Есть блок Tracker.autorun с вызовом Meteor.subscribe внутри. Все идет нормально. На стороне сервера есть соответствующий Meteor.publish, который объявляет обратный вызов.

Насколько я понимаю, обратный вызов Meteor.publish должен срабатывать один раз для каждой полученной подписки, но каким-то образом этот обратный вызов срабатывает 3-4 раза для одной подписки.

В моем последнем тесте блок Tracker.autorun выполнялся 4 раза, подписка выполнялась только 1 раз и обратный вызов срабатывал 4 раза.

Meteor.subscribe запускается только один раз, даже трекер запускается несколько раз. Как это могло вызвать обратный вызов, чтобы запустить больше один раз?

Имеет ли это смысл? Знаете, чем можно объяснить такое поведение?

Если вам нужна какая-либо другая информация, просто дайте мне знать. Заранее спасибо

Meteor.publish('current-user', function currentUser(credentials) {
  return Users.find();
});
Tracker.autorun((c) => {
  if (!currentUserHandler) {
    currentUserHandler = Meteor.subscribe('current-user', this.credentials);
  }
});

1 Ответ

0 голосов
/ 22 мая 2019

Следует ожидать, что автозапуск сработает дважды, как обычно, один раз без данных, а второй с некоторыми данными.

Это позволяет вам показать состояние «загрузки» до того, как данные поступят.

Вы подписываетесь на коллекцию users, которая является коллекцией special.Метеор использует его для аутентификации, а также для записи активности сеанса.Вы делаете Users.find(), который является нефильтрованным запросом для всей коллекции пользователей, поэтому любая модификация любого пользователя вызовет его срабатывание.Вы также не сможете просматривать все записи пользователей (по соображениям безопасности).

Возможно, вы храните дополнительные данные в записи пользователей, поэтому вам необходимо подписаться на нее.Я бы порекомендовал вам сохранить эти данные в другой коллекции, такой как «участники», «посетители», «профили» или любое другое имя, которое вам подходит.Скорее всего, все будет работать лучше.

...