[解決済み] 解決されない約束はメモリリークの原因になりますか?
質問
私は
Promise
. 必要に応じてAJAXのリクエストをキャンセルするために作りました。しかし、そのAJAXをキャンセルする必要がないので、私はそれを解決したことがなく、AJAXは正常に完了しました。
簡略化したスニペットです。
var defer = $q.defer();
$http({url: 'example.com/some/api', timeout: defer.promise}).success(function(data) {
// do something
});
// Never defer.resolve() because I don't need to cancel that ajax. What happens to this promise after request?
このような決して解決されない約束はメモリリークを引き起こすのでしょうか?を管理する方法について何かアドバイスがありますか?
Promise
のライフサイクルを管理する方法についてのアドバイスはありますか?
どのように解決するのですか?
まあ、強制的に割り当てられたままになってしまうので、明示的な参照を保持していないのでしょうけど。
私が考えついた最も単純なテストは、実際に多くの約束を割り当てて、それらを解決しないことです。
var $q = angular.injector(["ng"]).get("$q");
setInterval(function () {
for (var i = 0; i < 100; i++) {
var $d = $q.defer();
$d.promise;
}
}, 10);
そして、ヒープそのものを観察します。Chrome プロファイリング ツールで見ることができるように、これは 100 個の約束を割り当てるために必要なメモリを蓄積し、その後、全体のために 15 メガバイト未満でちょうどそこにとどまります。 JSFIddle ページ
反対側から見てみると
$q
ソースコード
グローバルポイントから特定のプロミスへの参照はなく、プロミスからそのコールバックへの参照のみであることがわかります。このコードは非常に読みやすく、明確です。しかし、コールバックからプロミスへの参照がある場合はどうなるのか見てみましょう。
var $q = angular.injector(["ng"]).get("$q");
console.log($q);
setInterval(function () {
for (var i = 0; i < 10; i++) {
var $d = $q.defer();
(function ($d) { // loop closure thing
$d.promise.then(function () {
console.log($d);
});
})($d);
}
}, 10);
<イグ
というわけで、最初の割り当ての後、それも処理できるようになったようです :)
最後の例をさらに数分間実行させると、GC のいくつかの興味深いパターンを見ることもできます。しばらく時間がかかりますが、コールバックをクリーンアップできていることがわかります。
要するに、少なくともモダンブラウザでは、外部参照を持たない限り、未解決のプロミスについて心配する必要はないのです。
関連
-
[解決済み] EventEmitter のメモリリークの可能性が検出された
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] performSelectorのセレクタが不明なため、リークが発生する可能性があります。
-
[解決済み】C++のコード/プロジェクトでメモリリークを見つけるには?
-
[解決済み] JSのDateからDay名
-
[解決済み] JavaScript で範囲を作成する - 奇妙な構文
-
[解決済み] チェックボックスが選択されているかどうかを確認するjQuery
-
[解決済み] 兄弟ノードを選択する方法はありますか?
-
[解決済み] moment.jsでミュータビリティを回避するには?
-
[解決済み] JavaScript で `throw` の後に `return` をする必要がありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] <Enter>でjQuery UIダイアログを送信する
-
[解決済み] Google maps API V3 - 同一地点に複数のマーカーを設置する。
-
[解決済み] bootstrap のポップオーバーがすべての要素の上に表示されない
-
[解決済み] 文字列がhtmlであるかどうかをチェックする
-
[解決済み] Reactコンポーネントでthis.setStateを複数回使用するとどうなりますか?
-
[解決済み] イテレータでmap()を使用する
-
[解決済み] Chromeのwebkitインスペクタで「Unsafe JavaScript attempt to access frame with URL...」というエラーが継続的に発生する。
-
[解決済み] なぜjavascriptのES6 Promisesはresolve後も実行を継続するのですか?
-
[解決済み] JavaScript で css プロパティを使用して HTML 要素の背景色を設定する方法
-
[解決済み] 変異を伴わないオブジェクトからの値の削除