Как отменить "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(); на клиенте. Если пользователь отключился, публикации все равно будут остановлены.