私のアプリケーションには、モデルとストアのようなものがあります。モデルオブジェクトは、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();
使用をあなたの記憶を自由に保つためのプロトタイプ... –
Couldntはsimpそう:モデル1 =; ?? –
問題は解決するまで、run関数がすべてのクロージャ(objなど)を含むことを約束するということです。したがって、モデル1を削除してもメモリのクリーンアップは発生しません。メソッドの実行を完全に防止し、モデル1のメモリから削除する方法が必要です。 –