[英]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 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.