簡體   English   中英

如何撤消“Meteor.publish”,並撤消“new Meteor.Collection”

[英]How to undo “Meteor.publish”, and undo “new 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中看到“取消發布”或“Collection.stop”類型的方法。

我該如何進行清理?

您需要分兩步完成此操作。 首先,停止並刪除發布,然后從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刪除它。 我現在不知道該怎么做。 也許Mongo驅動程序可以做到這一點,但它需要在DDP連接上進行一些接管。

你可以調用subscriptionHandle.stop(); 在客戶端上。 如果用戶已斷開連接,則無論如何都會停止發布。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM