2016-09-28 59 views
1

我有一个模型和一个像我的应用程序中的商店。模型对象使用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();

+0

使用原型,以保持你的记忆免费... –

+0

Could not you simp ly do:model1 =; ?? –

+0

问题是,承诺保持运行功能包括所有闭包(obj等)直到解决。因此,删除模型1不会导致内存清理。我需要一种方法来完全防止方法从执行中运行并从model1的内存中移除。 –

回答

2

,如果可能与真正的诺言我不是舒尔,这就是为什么我只是写一个自己的实现:

function prom(){ 
console.log("prom registered"); 
this.funcs=[]; 
} 
prom.prototype.then=function(func){ 
this.funcs.push(func); 
console.log("callback added"); 
return this.funcs.length-1; 
} 
prom.prototype.resolve=function(){ 
this.funcs.forEach((func)=>{func();}); 
console.log("resolved"); 
} 
prom.prototype.dismiss=function(id){ 
this.funcs.splice(id,1); 
console.log("callback destroyed"); 
} 

使用这样的:

store=new Prom(); 
id=store.then(function(){}); 
store.dismiss(id); 
store.resolve();//silence 
+0

是的,我想到了。看起来这对我来说是最简单的解决方案。谢谢。 –

+0

欢迎:) –