在 AUTH_REQUIRED 错误和路由解析被拒绝后加载视图和控制器

Load a view & controller after AUTH_REQUIRED error and route resolve has been rejected

在AngularJS中(我是新手)我怎么能'resolve'一个在路由过程中被拒绝的promise?

我的应用程序要求所有访问者以匿名方式或通过指定他们的凭据进行身份验证 -- 我使用的是 Firebase 和 AngularFire。

最初,当访问者导航到 route 时,我会在使用 $routeProvider.

的路由期间检查他们是否通过 resolve 进行身份验证

如果访问者未通过身份验证(error === 'AUTH_REQUIRED'),承诺将被拒绝。然后我匿名验证用户。

由于承诺被拒绝,路由的 controllerview 没有加载。

问:匿名认证后如何加载路由的controllerview

我想我可以通过某种方式 refresh/reload 路线,但我也想有更好的方法。

因此对于导航到需要身份验证的路由的未经身份验证的用户(几乎所有人都会):

  1. 需要身份验证;拒绝承诺
  2. 匿名验证访问者
  3. 匿名认证成功;加载路由的 controllerview(以及其他任何东西),如果访问者已经通过身份验证

据我了解,我无法解决已被拒绝的承诺。

希望对你有所帮助;这是我目前正在尝试实现这一目标的示例:

var app = angular.module('vo2App', ['firebase', 'ngRoute']);

app.config(['$routeProvider', function ($routeProvider) {
  $routeProvider
  .when('/', {
    controller: 'HomeCtrl',
    resolve: {
      'currentAuth': ['Auth', function (Auth) {
        return Auth.$requireAuth();
      }]
    },
    templateUrl: './views/home.html'
  })
}]);

app.run(['$rootScope', 'Auth', function ($rootScope, Auth) {
  $rootScope.$on('$routeChangeError', function (event, next, prev, error) {
    if (error === 'AUTH_REQUIRED') {
      console.log('Unauthorized');

      Auth.$authAnonymously().then(function (authData) {
        console.log(authData);
      }).catch(function(error) {
        console.log(error);
      });
    }
  });
}]);

app.controller('HomeCtrl', ['currentAuth', function (currentAuth) {
  console.log(currentAuth);
}]);

app.factory('Auth', ['$firebaseAuth', function ($firebaseAuth) {
  var ref = new Firebase('https://myvo2-mx.firebaseio.com');

  return $firebaseAuth(ref);
}]);

为什么 Auth.$requireAuth(); 不调用 Auth.$authAnonymously() 以便只有在两者都失败时才可以拒绝承诺。

基本上,

var defer = $q.defer();
Auth.$requireAuth().then(defer.resolve,function(){
   Auth.$authAnonymously().then(defer.resolve,defer.reject)
})
return defer.promise;