我有一個模型和一個像我的應用程序中的商店。模型對象使用promise等待來自商店的數據。JavaScript Promise.then回滾
但對於一些情況下,我需要刪除的模式,但因爲我用的是我的承諾模式仍然關閉和GC是無法清除的對象。
我正在尋找如何從無極對象中刪除的處理方式。
在下面我創建了兩個模型對象,並試圖從內存中刪除其中的一個例子。
此外,通過某些情況下,store.load方法可並不是所有的應用程序生命週期中,因爲在實際應用中,這store.load方法的一些用戶活動啓動後執行的。商店對象具有單個實例,並且在應用程序生命週期中永遠存在。並且在一段時間之後,承諾可以保留物品的掠奪並防止刪除模型。
你可以建議我如何解決這個問題,或者提出其他普通生活方式。
當然,我可以遠離諾言。
通常我的邏輯是這樣的:創建大量UI元素包裝器(其中一些會在某些時候死亡,其中一些會永久生存),等待一些用戶活動,並且當用戶抓住應用程序加載一些數據時模型也應該使用這些數據。
var createModel = function(dataStore, name) {
var obj = {
linkToDOM: { name: name, text: 'Here should be a link to the DOM object and etc.' },
init: function(data) { data.whenLoaded().then(this.run.bind(this)); },
run: function(data) { console.log('Do hard work with DOM and data', this.linkToDOM, data); },
remove: function() { delete this.linkToDOM; delete this.run; console.log('Can I go away? Pleaseee... Why not!?'); }
};
obj.init(dataStore);
return obj;
};
var store = {
_resolve: undefined,
_loadPromise: undefined,
init: function() {
var self = this;
this._loadPromise = new Promise(function(resolve) { self._resolve = resolve; });
},
whenLoaded: function() {
return this._loadPromise;
},
load: function() {
var self = this;
setTimeout(() => {
self._resolve({msg: 'loaded', data: {a:1}});
}, 1000);
}
}
store.init();
var model1 = createModel(store, 'model 1');
var model2 = createModel(store, 'model 2');
store.load();
// I don't need you any more!
model1.remove();
使用原型,以保持你的記憶免費... –
Could not you simp ly do:model1 =; ?? –
問題是,承諾保持運行功能包括所有閉包(obj等)直到解決。因此,刪除模型1不會導致內存清理。我需要一種方法來完全防止方法從執行中運行並從model1的內存中移除。 –