まあ、割り当てられたままになるので、それへの明示的な参照を保持しないと仮定しています。
私が考えることができる最も簡単なテストは、実際に多くの約束を割り当て、それらを解決しないことです:
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 個の promise を割り当てるために必要なメモリを蓄積し、 JSFIddle ページ全体で 15 メガバイト未満で「そこにとどまる」だけです。
逆に$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 のいくつかの興味深いパターンも確認できます。しばらく時間がかかることがわかりますが、コールバックをきれいにすることはできます。
要するに - 少なくとも最新のブラウザーでは - それらへの外部参照がない限り、未解決の promise について心配する必要はありません。