Автозапуск, ReactiveVar и Подписки
В вашем примере кода сама подписка перезапустит функцию публикации сервера, поскольку входная переменная подписки email
зависит от реактивной переменной validEmail
и, таким образом, вызывает autorun
при изменении validEmail
.
Вы можете легко проверить это на консоли сервера, зарегистрировав что-то на консоли в публикации.
Если validEmail
остается неизменным, то нет причины для запуска autorun
(если нет других реактивных источников, которые не могут быть добавлены в ваш пример кода).
А как насчет подписанных данных
Теперь, если что-то привело к повторному запуску подписки, и вы хотите знать, изменились ли данные коллекции, вы можете легко проверить collection.count()
, но это может быть ошибочным.
Представьте, что ваша публикация параметризована так, чтобы включать разные поля по разным параметрам, тогда данные, передаваемые в коллекцию на стороне клиента, будут другими.
Затем вам потребуется метод проверки целостности данных на стороне клиента.
Использование хэшей для проверки целостности
Возможная помощь будет заключаться в том, чтобы генерировать hases из набора данных, используя пакет sha
.
Например, вы можете создать один хеш всей вашей коллекции:
// get data
const data = Collection.find().fetch();
// map data to strings
// and reduce to one string
const hashInput = data.map(doc => JSON.stringify(doc) ).reduce((a, b) => a + b);
// generate hash
const collectionHash = SHA256(hashInput);
После следующего onReady
вы можете сгенерировать новый хэш коллекции и сравнить его с предыдущим хешем. Если они разные, значит что-то изменилось.
Это также устраняет необходимость в итерации документов коллекции, если вы хотите знать только, изменились ли данные, но не показывает, какой документ изменился.
Хеширование отдельных документов
Хеширование отдельных документов дает вам более полное представление о том, что изменилось. Для этого вам нужно всего лишь создать карту хешей вашей коллекции:
// get data
const data = Collection.find().fetch();
// map data to strings
const hashes = data.map(doc => { _id: doc._id, hash: SHA256( JSON.stringify(doc) ) });
Вы можете хранить эти хеши вместе с _id
документа. Если после новой подписки хеш документа отличается, вы можете предположить, что изменение связано с этим документом.
Общие примечания
- хэширование - это какая-то дорогостоящая операция, поэтому может быть сложно поддерживать производительность больших коллекций
- обычно вы должны проектировать ваш паб / саб и автозапуск таким образом, чтобы при изменении ввода вывод изменялся
- код написан холодным шрифтом, поэтому он может не работать из коробки. Пожалуйста, дайте мне знать, если что-то не так.