2016-09-28 6 views
1

私のアプリケーションには、モデルとストアのようなものがあります。モデルオブジェクトは、promiseを使用してストアからのデータを待機します。JavaScript Promise.thenロールバック

しかし、私はモデルを削除する必要がありますが、私の約束を使用しているため、私のモデルはまだ閉じており、GCはオブジェクトをクリーニングできません。

私はハンドラをPromiseオブジェクトから削除する方法を探しています。

以下の例では、2つのモデルオブジェクトを作成し、それらのうちの1つをメモリから削除しようとしています。

実際のアプリケーションの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

Couldntはsimpそう:モデル1 =; ?? –

+0

問題は解決するまで、run関数がすべてのクロージャ(objなど)を含むことを約束するということです。したがって、モデル1を削除してもメモリのクリーンアップは発生しません。メソッドの実行を完全に防止し、モデル1のメモリから削除する方法が必要です。 –

答えて

2

イム私は単に独自の実装書き込みなぜ本当の約束とその可能性は、thatsの場合SHUREません。このような

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

Youre welcome :) –

関連する問題