2015-06-18 2 views
0

Есть ли способ опубликовать обновления коллекции только по требованию? (например, отправлять обновления только каждые 5 секунд?)По запросу Опубликовать на Метеор?

Я публикую таблицу лидеров, в которой показаны лучшие 50 игроков (имеют наибольшее количество очков) в игре. Обновления точек пользователей происходят часто, так что таблица лидеров меняется очень часто (каждые 1-5 секунд). Каждые минуты или около того сервер обновляет точки для ~ 100 пользователей в цикле forEach. Проблема в том, что методы публикации сразу начинают обновляться, прежде чем все 100 элементов будут обновлены. Это создает болезненную проблему с производительностью (публикация обновлений для всех пользователей несколько раз) ...

Есть ли способ сохранить публикацию до тех пор, пока все обновления не будут выполнены? Или способ обновить опубликованные данные только каждые 5 секунд, а не сразу?

Благодарим за помощь! :)

+0

Похоже на статью, которую я недавно прочитал: http://tomkelsey.co.uk/reining-in-the-reactivity-with-meteor/, возможно, это будет help :) –

+0

Прочитав свой вопрос во второй раз, ваша предпосылка неверна. Сначала вы спросите, как это сделать «по требованию» (от клиента), затем вы приводите пример «каждые 5 секунд», который контролируется сервером. Пожалуйста, сушите свой вопрос до ** единственной, точной ** проблемы. –

ответ

0

В статье http://tomkelsey.co.uk/reining-in-the-reactivity-with-meteor/ обсуждает этот точный вопрос, автор «использовали комбинацию методов Метеор и обычное издание/подписки подход. Упрощенный пример изложен ниже.

В методе onCreated главной страницы Я прошу отсортированный массив элементов _ids с сервера и сохранить их в переменную сессии под названием itemIds:

Meteor.call('getItemIds', function(err, res) { 
    Session.set('itemIds', res); 
}); 

на сервере, метод определяется как:

Meteor.methods({ 
    getItemIds: function() { 
    return Items.find({}, {fields: {_id: 1}, sort: 
    {rank:1}}).fetch(); 
    } 
}); 

Я тогда следить за любыми изменениями в переменной itemIds сеанса и (вос) подписываются соответственно:

var self = this; 
self.autorun(function() { 
    self.subscribe('itemsById', Session.get('itemIds')); 
}); 

На сервере, публикация выглядит следующим образом:

Meteor.publish('itemsById', function(itemIds) { 
    return Items.find({}, {_id: {$in: itemIds}}); 
}); 

Мои шаблоны перебирает itemIds, а не курсором элементов. Это означает, что порядок элементов остается статичным.

Для каждого _id в itemIds я могу сделать Items.find (_id) - данные будут в нашей клиентской части. Коллекция предметов предоставлена ​​нашей подпиской itemsById.

Вуаля у нас есть список активных элементов, которые сохраняют свой порядок, пока страница не обновляется.»

Звук, как она может быть адаптирована для вас :)

1

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

var pubsHandlers = []; 

Meteor.publish('totalScore', function() { 
    this.added('someClientCollection', 'totalScoreId', { 
    totalScore : someGetTotalScoreFunction() 
    }); 
    pubsHandlers.push(this); //Maaaaybe not the cleanest thing to do. 
    this.ready(); 
}); 

Meteor.setInterval(function updateScores() { 
    var newTotalScore = somegetTotalScoreFunction() 
    pubsHandlers.forEach(function(pubHandler) { 
    pubHandler.changed('someClientCollection', 'totalScoreId', { 
     totalScore : newTotalScore 
    }); 
}, 5000); //Each 5 seconds, update everyone 

Итак, вот что происходит:

  1. Публикация в обычае способ, с помощью adding документа в соответствии с нашей публикацией,
  2. Помня обработчик публикацию для дальнейших обновлений,
  3. В более позднее время (здесь в interval), используйте запоминающиеся обработчик update документа.

Главное преимущество заключается в том, чтобы сервер полностью контролировал публикацию и ее обновления.
Основным недостатком является использование push(this). Это не обязательно плохо, но выглядит так чертовски ужасно ...

+0

Я впервые увидел этот образец в видеоролике «Метеор Devshop». Если вам неизвестно, какое видео это было, не стесняйтесь добавлять ссылку в комментарий или в редактирование. –

Смежные вопросы