Как вручную опрашивать данные с помощью метеора?
Я построил таблицу скользящих журналов, где отображаются последние 500 событий. Я не хочу, чтобы это было реактивным, потому что трафик слишком высок, и он просто заставил бы экран постоянно мигать. Вместо этого я бы хотел, чтобы клиент опрашивал сервер каждую минуту.
Я уже отключил автопубликацию, и код сервера публикует только последние 500 событий. Клиент подписывается на тот же канал, как обычно. Так как я не запускаю набор реплик (то есть не оплог) на моем mongodb, сервер на самом деле вообще не реагирует (если я использую обычный клиент mongo для вставки новых документов, приложение метеора об этом не узнает). Я думаю, что это на самом деле работает в мою пользу, так как я вообще не хочу реактивности.
Я думаю, что могу использовать Meteor.setInterval для выборки данных каждую минуту, но я не знаю, как обновить клиентский кеш данных минимонго (или сделать его недействительным, чтобы он мог попросить сервер опубликовать новые копии / дельты).
Извините, если это такой простой вопрос. Я новичок с метеором.
Заранее спасибо.
3 ответа
Предположим, что вы используете Meteor.Collection. Согласно документации Meteor, вы можете отключить реактивность вашего запроса:
your_collection.find({}, {reactive: false})
затем, когда вы хотите обновить свои результаты, позвоните еще раз. В вашем случае звоните за минуту.
Я думаю, что опрос клиентов не является хорошим способом отправки данных через определенные промежутки времени. Если единственная проблема с постоянным обновлением - это мигание экрана, то просто делайте обновление помощника по шаблонам через определенные промежутки времени.
Примерный пример клиентского кода:
Meteor.setInterval( function(){
Session.set('refresh', new Date());
}, 1000);
Template.whatever.helpers({
logs: function(){
Session.get('refresh');
return Logs.find({},{reactive:false});
}
});
Если вы чувствуете, что метеор не может справиться с такой нагрузкой, возможно, не стоит использовать его в вашем случае. Внешний интерфейс Meteor (Blaze) можно использовать без Meteor: https://github.com/meteor/blaze
Причина, по которой я говорю, что гнездо DDP все еще будет открыто. Тем не менее, если вы хотите сохранить это таким образом, вы можете использовать Meteor.call и Meteor.setInterval
Серверная сторона
Meteor.methods({
"yourdata" : function(data) {
var somequery = MyCollection.find().fetch()
return somequery
}
});
Сторона клиента
Meteor.setInterval(function() {
Meteor.call("yourdata", function(err, result) {
Session.set("results", result);
});
}, 60000 /*1 minute poll*/);
Тогда в ваших помощников
Template.yourTemplate.helpers({
results: function() {
return Session.get("results");
}
});
Тогда вы можете использовать {{#each results}}
чтобы отобразить ваши данные, как и раньше.
Почему это плохая идея
Хотя вы можете сделать это с помощью приведенного выше кода, если это ваш выбор:
Имейте в виду, что если в вашей базе данных НЕТ изменений, тогда ваши накладные расходы при использовании опроса намного хуже, чем при использовании обычного Meteor.publish, особенно если вы используете оплог.
Это потому, что вы будете запрашивать базу данных каждую минуту, в то время как с обычными методами публикации вы бы не сделали ни одного обращения к базе данных (так как нет изменений)
Это немного похоже на проверку электронной почты каждые 20 минут или около того или использование push-уведомлений на вашем телефоне. Если вы не получаете письмо, проверять его каждые 20 минут - пустая трата времени, и пуш-уведомление всегда будет быстрее.