我有一个模型和一个像我的应用程序中的商店。模型对象使用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的内存中移除。 –