diff options
| author | Andy Gurden | 2013-08-13 12:55:06 +0100 | 
|---|---|---|
| committer | Vojta Jina | 2013-08-14 16:04:48 -0700 | 
| commit | ac69392cd7f939ebbd37765e377051d4c05df4a5 (patch) | |
| tree | 1ebf5b0fab1adcedc6ebe388d45091e69d7fc2f2 /src | |
| parent | a5fb372e1e6aed8cdb1f572f1df3d6fe89388f3e (diff) | |
| download | angular.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.js | 9 | 
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; | 
