ui-router is supposed to throw a $stateChangeError
if a route resolve is rejected. You need to watch for this event, and trigger your state transition there.
As per the wiki:
$stateChangeError
- fired when an error occurs during transition. It's important to note that if you have any errors in your resolve functions (javascript errors, non-existent services, etc) they will not throw traditionally. You must listen for this $stateChangeError event to catch ALL errors.
https://github.com/angular-ui/ui-router/wiki#wiki-state-change-events
As @gustavohenke mentioned in the comments, a good place to put this handler is your app's primary .run()
function.