ठीक है, मैं मान रहा हूँ कि आप इसके बारे में कोई स्पष्ट संदर्भ नहीं रखते हैं क्योंकि यह इसे आवंटित रहने के लिए मजबूर करेगा।
सबसे सरल परीक्षण जो मैं सोच सकता था कि वास्तव में बहुत सारे वादे आवंटित कर रहे हैं और उन्हें हल नहीं कर रहे हैं:
var $q = angular.injector(["ng"]).get("$q");
setInterval(function () {
for (var i = 0; i < 100; i++) {
var $d = $q.defer();
$d.promise;
}
}, 10);
और फिर खुद ही ढेर देख रहा है। जैसा कि हम क्रोम प्रोफाइलिंग टूल में देख सकते हैं, यह 100 वादों को आवंटित करने के लिए आवश्यक मेमोरी को संचित करता है और फिर पूरे 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 के कुछ दिलचस्प पैटर्न भी देख सकते हैं यदि हम उनके अंतिम उदाहरण को कुछ और मिनटों तक चलने दें। हम देख सकते हैं कि इसमें कुछ समय लगता है - लेकिन यह कॉलबैक को साफ करने में सक्षम है।
संक्षेप में - कम से कम आधुनिक ब्राउज़रों में - आपको अनसुलझे वादों के बारे में चिंता करने की ज़रूरत नहीं है जब तक कि आपके पास उनके लिए बाहरी संदर्भ नहीं हैं