Vâng, tôi cho rằng bạn không giữ một tham chiếu rõ ràng về nó vì điều đó sẽ buộc nó phải được phân bổ.
Thử nghiệm đơn giản nhất mà tôi có thể nghĩ ra là thực sự phân bổ rất nhiều lời hứa và không giải quyết được chúng:
var $q = angular.injector(["ng"]).get("$q");
setInterval(function () {
for (var i = 0; i < 100; i++) {
var $d = $q.defer();
$d.promise;
}
}, 10);
Và sau đó xem chính đống. Như chúng ta có thể thấy trong các công cụ cấu hình của Chrome, điều này tích lũy bộ nhớ cần thiết để phân bổ 100 lời hứa và sau đó chỉ "ở đó" ở mức dưới 15 megabyte cho toàn bộ trang JSFIddle
Từ phía bên kia, nếu chúng ta nhìn vào $q
mã nguồn
Chúng ta có thể thấy rằng không có tham chiếu từ điểm toàn cục đến bất kỳ lời hứa cụ thể nào mà chỉ từ một lời hứa đến các lệnh gọi lại của nó. Mã rất dễ đọc và rõ ràng. Hãy xem điều gì sẽ xảy ra nếu bạn có tham chiếu từ callback đến promise.
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);
Vì vậy, sau khi phân bổ ban đầu - có vẻ như nó cũng có thể xử lý điều đó :)
Chúng ta cũng có thể thấy một số mẫu thú vị của GC nếu chúng ta để ví dụ cuối cùng của anh ấy chạy thêm vài phút nữa. Chúng ta có thể thấy rằng phải mất một lúc - nhưng nó có thể làm sạch các lệnh gọi lại.
Tóm lại - ít nhất là trong các trình duyệt hiện đại - bạn không phải lo lắng về những lời hứa chưa được giải quyết miễn là bạn không có tham chiếu bên ngoài về chúng