0

在 AngularJS(我是新手)中,我如何“解决”在路由期间被拒绝的承诺?

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

最初,当访问者导航到 a 时,route我检查他们是否resolve在路由期间使用$routeProvider.

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

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

问:如何在匿名验证访问者身份后controller加载路线?view

我想我可以以某种方式刷新/重新加载路线,但我也想有更好的方法。

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

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

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

我希望你能帮忙;这是我目前正在尝试实现这一目标的示例:

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);
}]);
4

1 回答 1

1

为什么不Auth.$requireAuth();打电话Auth.$authAnonymously(),以便只有在两者都失败时才能拒绝承诺。

基本上,

var defer = $q.defer();
Auth.$requireAuth().then(defer.resolve,function(){
   Auth.$authAnonymously().then(defer.resolve,defer.reject)
})
return defer.promise;
于 2015-09-03T12:57:18.430 回答