Использование публикаций для создания индикатора выполнения для подписок

Я звоню в Google Analytics API несколько раз и загружаю эти данные в подписку. Теперь я хочу создать индикатор выполнения, который информирует пользователя о том, что данные загружаются, и дает представление о том, сколько времени это займет.

Я прочитал, что лучше всего использовать публикации для передачи данных с сервера на клиент. Это правда?

Я создал следующую публикацию на сервере. Что делает следующее:

  1. установить начальный progressValue и начальную публикацию с идентификатором 1
  2. продолжайте цикл, если progressValue меньше 100, и сообщите, что публикация 1 меняется.
  3. Ниже этого кода у меня запущена другая публикация, где progressValue устанавливается пошагово в цикле.

При просмотре клиента публикуется только последнее progressValue. До этого я получаю много пустых массивов. Так что это как:

[]
[]
[]
[]
...
Progress publication 

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

Если есть какие-либо более полезные предложения по созданию индикатора выполнения подписки, эти ответы также будут приняты.

if (Meteor.isServer) {
  let progressValue = 0;

  Meteor.publish('progress', function() {
    const self = this;
    let lastProgressValue = 0;

    const id = 1;

    self.added('progress', id, {
      progress: progressValue,
      total: 100,
    });


    while (progressValue < 100) {
      self.changed('progress', id, {
        progress: progressValue,
        total: 100,
      });
  }
 self.ready();      
  });
...

1 ответ

Решение

Хм... так, пару вещей здесь.

Я прочитал, что лучше всего использовать публикации для передачи данных с сервера на клиент. Это правда?

В этом весь смысл Метеора, использующего ддп. Означает, что данные отправляются клиенту автоматически с сервера. Таким образом, основная часть работы по манипулированию данными фактически выполняется на стороне клиента с использованием минимонго.

Взгляните на эту статью для хорошего обсуждения "автоматики"...

http://richsilv.github.io/meteor/meteor-low-level-publications/

Как вы продвигаетесь?

Вы не хотите пытаться обрабатывать увеличение на стороне сервера. Вместо этого вы хотите получить простой подсчет сервера, возможно, используя реактивную агрегацию (см. Мой ответ здесь Как реактивно агрегировать mongodb в метеоре) и отправить это клиенту. Итак, сервер делает подсчет как публикацию и сообщает клиенту "57".

Затем, как ваша обычная публикация данных, вы отправляете 57 записей клиенту. На клиенте теперь вы в основном делаете ту же сумму, что и на сервере, но, поскольку клиент получил только некоторые из 57 записей данных, вы фактически получаете счетчик прогресса, разделяя полученное сервером сообщение от общего количества. быть отправленным.

Резюме

На СЕРВЕРЕ - 2 публикации, 1 реактивный агрегат для количества отправляемых записей и 1 как обычные отправляемые данные.

На КЛИЕНТА - функция для подсчета записей в локальной коллекции минимонго - collection.find({}). Count() - сделает свое дело. Это будет увеличиваться по мере получения каждой записи клиентом от сервера.

Ход выполнения так же прост, как и счет клиента, разделенный на количество отправленных сервером.

Другие вопросы по тегам