Есть ли какой-нибудь способ настроить только публикацию метеора? - PullRequest
3 голосов
/ 28 июня 2019

Я пытаюсь реализовать свой собственный пинг-понг для моего приложения-метеора (у meteor есть пинг-понг для внутреннего использования, но я хочу ввести собственное поведение).Единственный способ отправки данных клиенту - использование издателя, поэтому я установил setInterval, чтобы отправить новую полезную нагрузку с меткой времени понга, но в каждой новой подписке создается новая setInterval,Как я могу установить только одну публикацию или setInterval?Или есть какой-то другой способ отправить сообщение клиенту?

const COLLECTION_NAME = 'ping-pong';
const POLL_INTERVAL = 5000;

function pingPong(credentials) {
  const pongSender = () => {
    const id = _.uniqueId('pong-');
    const payload = {
      message: 'pong',
      time: Date.now(),
    };
    this.added(COLLECTION_NAME, id, payload);
  };
  pongSender();
  this.ready();
  const interval = Meteor.setInterval(pongSender, POLL_INTERVAL);

  this.onStop(() => {
    Meteor.clearInterval(interval);
  });
}

1 Ответ

2 голосов
/ 28 июня 2019

Каждая публикация обрабатывается отдельно, но вы можете создать только один интервал и позволить ему обновить список описателей публикации:

const pingPongSubscribed = [];
const pingPongIntervalId = setInterval(() => {
  pingPongSubscribed.forEach(handle => {
    // ...
    handle.added(COLLECTION_NAME, DOCUMENT_ID, payload);
  });
}, 5000);

// ...

Meteor.publish('example', function () {
  // ...
  pingPongSubscribed.push(this);
  this.onStop(() => {
    pingPongSubscribed.splice(pingPongSubscribed.indexOf(this), 1);
  });
});

Если вам нужно больше данных, просто сохраните их в pingPongSubscribed. Имейте в виду, что он будет синхронизирован с точки зрения подключения к одному серверу, а несколько экземпляров сервера не синхронизированы.

Также рассмотрите возможность использования changed. Каждое использование added создает новый документ в памяти сервера и клиента. Таким образом, вы будете управлять только одним документом и соответствующим образом реагировать на изменения.

...