Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit e7cea3d

Browse files
committed
fixup! fix(ngRoute): make route.resolve count as a pending request
1 parent 3fa796f commit e7cea3d

File tree

4 files changed

+59
-46
lines changed

4 files changed

+59
-46
lines changed

src/ngRoute/route.js

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -680,9 +680,10 @@ function $RouteProvider() {
680680
} else if (nextRoute || lastRoute) {
681681
forceReload = false;
682682
$route.current = nextRoute;
683-
684683
var nextRoutePromise = $q.resolve(nextRoute);
685684

685+
$browser.$$incOutstandingRequestCount();
686+
686687
nextRoutePromise.
687688
then(getRedirectionData).
688689
then(handlePossibleRedirection).
@@ -696,17 +697,24 @@ function $RouteProvider() {
696697
nextRoute.locals = locals;
697698
angular.copy(nextRoute.params, $routeParams);
698699
}
700+
699701
$rootScope.$broadcast('$routeChangeSuccess', nextRoute, lastRoute);
700702
}
701703
});
702-
}).catch(function(error) {
704+
}).
705+
catch(function(error) {
703706
if (nextRoute === $route.current) {
704707
$rootScope.$broadcast('$routeChangeError', nextRoute, lastRoute, error);
705708
}
706-
});
709+
}).
710+
finally(decrementRequestCount);
707711
}
708712
}
709713

714+
function decrementRequestCount() {
715+
$browser.$$completeOutstandingRequest(noop);
716+
}
717+
710718
function getRedirectionData(route) {
711719
var data = {
712720
route: route,
@@ -779,7 +787,6 @@ function $RouteProvider() {
779787

780788
function resolveLocals(route) {
781789
if (route) {
782-
$browser.$$incOutstandingRequestCount();
783790
var locals = angular.extend({}, route.resolve);
784791
angular.forEach(locals, function(value, key) {
785792
locals[key] = angular.isString(value) ?
@@ -790,9 +797,7 @@ function $RouteProvider() {
790797
if (angular.isDefined(template)) {
791798
locals['$template'] = template;
792799
}
793-
return $q.all(locals).finally(function(locals) {
794-
$browser.$$completeOutstandingRequest(noop);
795-
});
800+
return $q.all(locals);
796801
}
797802
}
798803

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
<html ng-app="lettersApp">
2-
<head>
3-
<meta charset="utf-8">
4-
<title>Angular.js Example</title>
2+
<body>
3+
<ng-view></ng-view>
4+
55
<script src="angular.js"></script>
66
<script src="angular-route.js"></script>
77
<script src="script.js"></script>
8-
</head>
9-
<body>
10-
<div ng-view></div>
118
</body>
129
</html>
Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,25 @@
11
'use strict';
22

3-
var lettersApp = angular.module('lettersApp', ['ngRoute']);
4-
5-
lettersApp.config(function($routeProvider) {
6-
$routeProvider.
7-
when('/', {
8-
template: '<ul><li ng-repeat="letter in letters">{{letter}}</li><ul>',
9-
controller: 'LettersCtrl',
10-
resolve: {
11-
letters: function($q) {
12-
var deferred = $q.defer();
13-
window.setTimeout(function() {
14-
deferred.resolve(['a', 'b', 'c', 'd', 'e']);
15-
}, 1000);
16-
return deferred.promise;
3+
angular.
4+
module('lettersApp', ['ngRoute']).
5+
config(function($routeProvider) {
6+
$routeProvider.
7+
when('/foo', {
8+
resolveRedirectTo: function($q) {
9+
return $q(function(resolve) {
10+
window.setTimeout(resolve, 1000, '/bar');
11+
});
1712
}
18-
}
19-
}).
20-
otherwise({
21-
redirectTo: '/'
22-
});
23-
});
24-
25-
lettersApp.controller('LettersCtrl', function($scope, letters) {
26-
$scope.letters = letters;
27-
});
13+
}).
14+
when('/bar', {
15+
template: '<ul><li ng-repeat="letter in $resolve.letters">{{ letter }}</li></ul>',
16+
resolve: {
17+
letters: function($q) {
18+
return $q(function(resolve) {
19+
window.setTimeout(resolve, 1000, ['a', 'b', 'c', 'd', 'e']);
20+
});
21+
}
22+
}
23+
}).
24+
otherwise('/foo');
25+
});

test/e2e/tests/ng-route-promise.spec.js

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,33 @@ describe('ngRoute promises', function() {
44
beforeEach(function() {
55
loadFixture('ng-route-promise');
66
});
7+
78
it('should wait for promises in resolve blocks', function() {
89
expect(element.all(by.tagName('li')).count()).toBe(5);
910
});
11+
1012
it('should time out if the promise takes long enough', function() {
1113
// Don't try this at home kids, I'm a protractor dev
12-
browser.manage().timeouts().setScriptTimeout(1);
13-
browser.waitForAngular().then(function() {
14+
browser.manage().timeouts().setScriptTimeout(1500);
15+
16+
browser.waitForAngular().
17+
then(onUnexpectedSuccess, onExpectedFailure).
18+
then(restoreTimeoutLimit);
19+
20+
// Helpers
21+
function onUnexpectedSuccess() {
1422
fail('waitForAngular() should have timed out, but didn\'t');
15-
}, function(error) {
16-
expect(error.message).toContain('Timed out waiting for asynchronous Angular tasks to finish after 0.001 seconds.');
17-
});
18-
});
19-
afterAll(function() {
20-
// Restore old timeout limit
21-
browser.manage().timeouts().setScriptTimeout(browser.getProcessedConfig().allScriptsTimeout);
23+
}
24+
25+
function onExpectedFailure(error) {
26+
expect(error.message).toContain(
27+
'Timed out waiting for asynchronous Angular tasks to finish after');
28+
}
29+
30+
function restoreTimeoutLimit() {
31+
return browser.getProcessedConfig().then(function(config) {
32+
browser.manage().timeouts().setScriptTimeout(config.allScriptsTimeout);
33+
});
34+
}
2235
});
2336
});

0 commit comments

Comments
 (0)