diff --git a/src/ng/q.js b/src/ng/q.js index 307dc1b42896..37f2649d8efd 100644 --- a/src/ng/q.js +++ b/src/ng/q.js @@ -161,14 +161,29 @@ */ function $QProvider() { - this.$get = ['$rootScope', '$exceptionHandler', function($rootScope, $exceptionHandler) { - return qFactory(function(callback) { - $rootScope.$evalAsync(callback); + this.$get = ['$rootScope', '$exceptionHandler','$browser', function($rootScope, $exceptionHandler,$browser) { + return qFactory(function (callback) { + if($rootScope.$$phase){ + $rootScope.$evalAsync(callback); + } + else { + var timeoutId = $browser.defer(function(){ + timeoutId = false; + $rootScope.$apply(); + }); + $rootScope.$evalAsync(function(){ + if(timeoutId){ + //$digest was called before + $browser.defer.cancel(timeoutId); + timeoutId = null; + } + $rootScope.$eval(callback); + }); + } }, $exceptionHandler); }]; } - /** * Constructs a promise manager. * diff --git a/src/ng/timeout.js b/src/ng/timeout.js index 81d09e8944dc..2515254a80b4 100644 --- a/src/ng/timeout.js +++ b/src/ng/timeout.js @@ -2,10 +2,13 @@ function $TimeoutProvider() { - this.$get = ['$rootScope', '$browser', '$q', '$exceptionHandler', - function($rootScope, $browser, $q, $exceptionHandler) { + this.$get = ['$rootScope', '$browser', '$exceptionHandler', + function($rootScope, $browser, $exceptionHandler) { var deferreds = {}; + var $q = qFactory(function(callback){ + $rootScope.$evalAsync(callback); + },$exceptionHandler); /** * @ngdoc function