Как смоделировать медленную публикацию Meteor?

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

Мой метод публикации имеет принудительный сон (с использованием будущего), но приложение всегда отображает только

Загрузка...

Вот публикация:

Meteor.publish('people', function() {
  Future = Npm.require('fibers/future');
  var future = new Future();

  //simulate long pause
  setTimeout(function() {
    // UPDATE: coding error here. This line needs to be
    //   future.return(People.find());
    // See the accepted answer for an alternative, too:
    //   Meteor._sleepForMs(2000);
    return People.find();
  }, 2000);

  //wait for future.return
  return future.wait();
});

И роутер:

Router.configure({
  layoutTemplate: 'layout',
  loadingTemplate: 'loading'
});

Router.map(function() {
  return this.route('home', {
    path: '/',
    waitOn: function() {
      return [Meteor.subscribe('people')];
    },
    data: function() {
      return {
        'people': People.find()
      };
    }
  });
});

Router.onBeforeAction('loading');

Полный исходный код: https://gitlab.com/meonkeys/meteor-simulate-slow-publication


person Adam Monsen    schedule 08.11.2014    source источник


Ответы (1)


Самый простой способ сделать это — использовать недокументированную функцию Meteor._sleepForMs следующим образом:

Meteor.publish('people', function() {
  Meteor._sleepForMs(2000);
  return People.find();
});
person David Weldon    schedule 08.11.2014
comment
Удобно, спасибо! Я обновил свой вопрос, чтобы показать ошибку кодирования, которую я тоже сделал. - person Adam Monsen; 08.11.2014
comment
Подсказка: не пытайтесь смотреть Meteor._sleepForMs на клиенте, это метод только для сервера. - person Tomas Romero; 08.11.2014
comment
Вопрос: Это сработало для меня, спасибо. Но только один раз. Я предполагаю, что после первой загрузки публикация кэшируется на клиенте. Есть ли способ имитировать более медленное соединение при каждом обновлении? (Или, по крайней мере, чтобы проверить это снова?) - person Arrowcatch; 24.02.2016
comment
Да, это ожидаемое поведение. Как только документы будут подписаны, вы попадете в кеш клиента для них. Чтобы снова увидеть задержку, вам нужно остановить подписку и начать ее снова (или обновить страницу и т. д.). - person David Weldon; 24.02.2016
comment
Вот о чем я думал. Но даже при обновлении коллекция появляется почти мгновенно. (Примечание: я удалил автопубликацию). Вы снова получаете задержку, когда обновляете? - person Arrowcatch; 25.02.2016
comment
Да. Обновление страницы уничтожит все активные подписки на клиенте. Я бы рекомендовал добавить console.log, чтобы узнать, звонят ли издателю. Если вы все еще не можете понять это, опубликуйте новый вопрос с соответствующим кодом. - person David Weldon; 25.02.2016