Как отменить "Meteor.publish" и отменить "новый Meteor.Collection",
Я вижу, что при публикации заполняется collection._connection.publish_handlers
, а также collection._connection.method_handlers
и, возможно, другие области.
Я хочу в основном очистить память, удалив ссылки на эту коллекцию и полностью опубликовать ее.
В основном каждый пользователь приложения имеет список коллекций для этого пользователя. Существует функция публикации, которая выглядит так, чтобы пользователь мог получить список своих коллекций:
Meteor.publish('users_collections', function() {
var self = this;
var handle = UsersCollections.find({ownerId: self.userId}).observeChanges({
added: function(id, collectionInfo) {
UsersCollectionManager.addUsersCollection(self.userId, collectionInfo.name);
}
});
});
Это публикует список пользовательских списков (и любой пользователь, который подключается, получает свой список).
Как только пользователь получает свой список, каждая из этих коллекций становится реактивной с новым Meteor.Collection и затем публикуется.
UsersCollectionManager.addUsersCollection = function(userId, collectionName) {
if (self.collections[userId].collections[collectionName] === undefined) {
self.collections[userId].collections[collectionName] = new Meteor.Collection(collectionName);
Meteor.publish(collectionName, function() {
return self.collections[userId].collections[collectionName].find();
});
}
};
Как только пользователь отключится, у меня есть функция, которая запускается.
если у этого пользователя нет открытых подключений (например: если у них открыто несколько окон и все соединения закрыты "все окна закрыты" ), тогда он запускает тайм-аут 30 с:
- очистить все эти вызовы публикации и новые вызовы Meteor.Collection для сохранения памяти
Поскольку другому пользователю приложения не понадобятся эти пользовательские коллекции.
Я не уверен, как на самом деле очистить их от памяти.
В Meteor API я не вижу типа "unpublish" или "Collection.stop".
Как выполнить очистку?
Ответы
Ответ 1
Вам нужно сделать это в два этапа. Сначала остановите и удалите публикации, а затем удалите сборку из Meteor.
Первый шаг довольно прост. Он требует, чтобы вы сохраняли дескрипторы каждой подписки:
var handles = [];
Meteor.publish('some data', function() {
//Do stuff, send cursors, this.ready(), ...
handles.push(this);
});
И позже, остановите их:
var handle;
while(handle = handles.shift()) {
handle.stop();
}
Все ваши публикации остановлены. Теперь удалить обработчик публикации. Это менее стандартно:
delete Meteor.default_server.publish_handlers['some data'];
delete Meteor.server.publish_handlers['some data'];
В основном вы должны сжечь ссылку на обработчик. Вот почему он менее стандартный.
Для коллекции вам сначала нужно удалить все документы, тогда вам нужно удалить ссылку. К счастью, удаление всех документов очень просто:
someCollection.remove({}, {multi : true}); //kaboom
Удаление ссылки на коллекцию сложнее. Если это объявленная коллекция без имени (new Mongo.Collection(null);
), вы можете просто удалить переменную (delete someCollection
), она не хранится нигде, насколько я знаю.
Если это именованная коллекция, то она существует в базе данных Mongo, что означает, что вы должны сказать Mongo о ее броске. Я понятия не имею, как это сделать в данный момент. Возможно, монгольский драйвер может это сделать, иначе потребуется соединение с DDP-соединением.
Ответ 2
Вы можете вызвать subscriptionHandle.stop();
на клиенте. Если пользователь отключился, публикации все равно будут остановлены.