Мені сподобалися відповіді вище, і я багато чого навчився з них, але є щось, чого не вистачає у більшості вищезазначених відповідей.
Я застряг у подібному сценарії, коли я розв’язував URL-адресу з деякими даними, які отримуються в першому запиті від сервера. Проблема, з якою я стикався, полягала в тому, що якщо обіцянка є rejected
.
Я використовую для користувача постачальник , який використовується для повернення , Promise
який було вирішено resolve
в $routeProvider
той час фази конфігурації.
Я хочу наголосити на тому, що це поняття when
робить щось подібне.
Він бачить URL в рядку url, а потім відповідний when
блок в називаному контролері і перегляд віднесений настільки добре.
Скажімо, у мене є такий фазовий код конфігурації.
App.when('/', {
templateUrl: '/assets/campaigns/index.html',
controller: 'CampaignListCtr',
resolve : {
Auth : function(){
return AuthServiceProvider.auth('campaign');
}
}
})
// Default route
.otherwise({
redirectTo: '/segments'
});
У кореневій URL-адресі браузера в першому блоці запуску дзвонять інакше otherwise
.
Давайте уявимо сценарій, коли я натискаю rootUrl в адресному рядку, AuthServicePrivider.auth()
викликається функція.
Скажімо, Обіцянка повернулася в стані відхилення, що тоді ???
Нічого не виводиться взагалі.
Otherwise
блок не буде виконуватися так, як це стосується будь-якого URL-адреси, який не визначений у конфігураційному блоці і невідомий для фази configure angularJs.
Нам доведеться впоратися з подією, яку звільняють, коли ця обіцянка не буде вирішена. При невдачі $routeChangeErorr
звільняється$rootScope
.
Його можна захопити, як показано в коді нижче.
$rootScope.$on('$routeChangeError', function(event, current, previous, rejection){
// Use params in redirection logic.
// event is the routeChangeEvent
// current is the current url
// previous is the previous url
$location.path($rootScope.rootPath);
});
IMO Як правило, це гарна ідея помістити код відстеження подій у запущений блок програми. Цей код запускається відразу після фази налаштування програми.
App.run(['$routeParams', '$rootScope', '$location', function($routeParams, $rootScope, $location){
$rootScope.rootPath = "my custom path";
// Event to listen to all the routeChangeErrors raised
// by the resolve in config part of application
$rootScope.$on('$routeChangeError', function(event, current, previous, rejection){
// I am redirecting to rootPath I have set above.
$location.path($rootScope.rootPath);
});
}]);
Таким чином, ми можемо впоратися з обіцяними помилками під час фази налаштування.