2016-09-28 30 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

歡迎:) –