From 331cd5a8cb5efdafe8ad7eb386aed4033cfc1bb3 Mon Sep 17 00:00:00 2001 From: Misko Hevery Date: Fri, 7 Sep 2012 11:14:48 -0700 Subject: [PATCH] fix($evalAsync): have only one global async queue Having one async queue per scope complicates the matters when users wish to do partial scope updates, since many services put events on the rootScope. By having single queue the programing model is simplified. --- src/ng/rootScope.js | 22 +++++++++++----------- test/ng/rootScopeSpec.js | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/ng/rootScope.js b/src/ng/rootScope.js index bd712e07b004..759b4c7291a7 100644 --- a/src/ng/rootScope.js +++ b/src/ng/rootScope.js @@ -195,7 +195,6 @@ function $RootScopeProvider(){ child['this'] = child; child.$$listeners = {}; child.$parent = this; - child.$$asyncQueue = []; child.$$watchers = child.$$nextSibling = child.$$childHead = child.$$childTail = null; child.$$prevSibling = this.$$childTail; if (this.$$childHead) { @@ -362,7 +361,7 @@ function $RootScopeProvider(){ $digest: function() { var watch, value, last, watchers, - asyncQueue, + asyncQueue = this.$$asyncQueue, length, dirty, ttl = TTL, next, current, target = this, @@ -371,18 +370,19 @@ function $RootScopeProvider(){ beginPhase('$digest'); - do { + do { // "while dirty" loop dirty = false; current = target; - do { - asyncQueue = current.$$asyncQueue; - while(asyncQueue.length) { - try { - current.$eval(asyncQueue.shift()); - } catch (e) { - $exceptionHandler(e); - } + + while(asyncQueue.length) { + try { + current.$eval(asyncQueue.shift()); + } catch (e) { + $exceptionHandler(e); } + } + + do { // "traverse the scopes" loop if ((watchers = current.$$watchers)) { // process our watches length = watchers.length; diff --git a/test/ng/rootScopeSpec.js b/test/ng/rootScopeSpec.js index 2ceb0eec0292..9830d9818860 100644 --- a/test/ng/rootScopeSpec.js +++ b/test/ng/rootScopeSpec.js @@ -441,7 +441,7 @@ describe('Scope', function() { child.$evalAsync(function(scope) { log += 'child.async;'; }); child.$watch('value', function() { log += 'child.$digest;'; }); $rootScope.$digest(); - expect(log).toEqual('parent.async;parent.$digest;child.async;child.$digest;'); + expect(log).toEqual('parent.async;child.async;parent.$digest;child.$digest;'); })); it('should cause a $digest rerun', inject(function($rootScope) {