aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAndy Gurden2013-08-13 12:55:06 +0100
committerVojta Jina2013-08-14 16:04:48 -0700
commitac69392cd7f939ebbd37765e377051d4c05df4a5 (patch)
tree1ebf5b0fab1adcedc6ebe388d45091e69d7fc2f2 /src
parenta5fb372e1e6aed8cdb1f572f1df3d6fe89388f3e (diff)
downloadangular.js-ac69392cd7f939ebbd37765e377051d4c05df4a5.tar.bz2
fix($timeout): clean deferreds immediately after callback exec/cancel
Make sure $timeout callbacks are forgotten about immediately after execution or cancellation. Previously when passing invokeApply=false, the cleanup used $q and so would be pending until the next $digest was triggered. This does not make a large functional difference, but can be very visible when looking at memory consumption of an app or debugging around the $$asyncQueue - these callbacks can have a big retaining tree.
Diffstat (limited to 'src')
-rw-r--r--src/ng/timeout.js9
1 files changed, 4 insertions, 5 deletions
diff --git a/src/ng/timeout.js b/src/ng/timeout.js
index 81d09e89..6cb62d7a 100644
--- a/src/ng/timeout.js
+++ b/src/ng/timeout.js
@@ -45,17 +45,15 @@ function $TimeoutProvider() {
deferred.reject(e);
$exceptionHandler(e);
}
+ finally {
+ delete deferreds[promise.$$timeoutId];
+ }
if (!skipApply) $rootScope.$apply();
}, delay);
- cleanup = function() {
- delete deferreds[promise.$$timeoutId];
- };
-
promise.$$timeoutId = timeoutId;
deferreds[timeoutId] = deferred;
- promise.then(cleanup, cleanup);
return promise;
}
@@ -77,6 +75,7 @@ function $TimeoutProvider() {
timeout.cancel = function(promise) {
if (promise && promise.$$timeoutId in deferreds) {
deferreds[promise.$$timeoutId].reject('canceled');
+ delete deferreds[promise.$$timeoutId];
return $browser.defer.cancel(promise.$$timeoutId);
}
return false;