Skip to content

Commit 96c47b8

Browse files
fix($timeout): make $flush handle new $timeouts added in $timeout callbacks
If a $timeout handler calls $timeout itself, this new $timeout should be added to the mock deferred queue with a "now" time based on when the original handler was triggered. Previously it was being added with a now time of when the `$timeout.flush` method was originally called. Closes angular#5420
1 parent 7a96add commit 96c47b8

File tree

1 file changed

+20
-14
lines changed

1 file changed

+20
-14
lines changed

src/ngMock/angular-mocks.js

+20-14
Original file line numberDiff line numberDiff line change
@@ -106,23 +106,29 @@ angular.mock.$Browser = function() {
106106
* @param {number=} number of milliseconds to flush. See {@link #defer.now}
107107
*/
108108
self.defer.flush = function(delay) {
109-
try {
110-
if (!angular.isDefined(delay)) {
111-
if (self.deferredFns.length) {
112-
delay = self.deferredFns[self.deferredFns.length-1].time - self.defer.now;
113-
} else {
114-
throw new Error('No deferred tasks to be flushed');
115-
}
116-
}
109+
var nextTime;
117110

118-
while (self.deferredFns.length && self.deferredFns[0].time <= self.defer.now + delay) {
119-
delay -= (self.deferredFns[0].time - self.defer.now);
120-
self.defer.now = self.deferredFns[0].time;
121-
self.deferredFns.shift().fn();
111+
if (angular.isDefined(delay)) {
112+
// A delay was passed so compute the next time
113+
nextTime = self.defer.now + delay;
114+
} else {
115+
if (self.deferredFns.length) {
116+
// No delay was passed so set the next time so that it clears the deferred queue
117+
nextTime = self.deferredFns[self.deferredFns.length - 1].time;
118+
} else {
119+
// No delay passed, but there are no deferred tasks so flush - indicates an error!
120+
throw new Error('No deferred tasks to be flushed');
122121
}
123-
} finally {
124-
self.defer.now += delay;
125122
}
123+
124+
while (self.deferredFns.length && self.deferredFns[0].time <= nextTime) {
125+
// Increment the time and call the next deferred function
126+
self.defer.now = self.deferredFns[0].time;
127+
self.deferredFns.shift().fn();
128+
}
129+
130+
// Ensure that the current time is correct
131+
self.defer.now = nextTime;
126132
};
127133

128134
self.$$baseHref = '/';

0 commit comments

Comments
 (0)