在AngularJS(我是新手)中,我如何“解决”在路由期间被拒绝的承诺?
我的应用要求所有访问者匿名或通过指定其凭据进行身份验证 - 我正在使用Firebase和AngularFire。
最初,当访问者导航到route
时,我会使用resolve
检查他们是否在路由期间使用$routeProvider
进行了身份验证。
如果访问者未经过身份验证(error === 'AUTH_REQUIRED'
),则拒绝承诺。然后我匿名验证用户。
由于承诺被拒绝,路线的controller
和view
未加载。
问:在我对访问者进行匿名身份验证后,如何加载路由controller
和view
?
我想我可以以某种方式刷新/重新加载路线,但我也想象有更好的方法。
因此,对于导航到需要身份验证的路由的未经身份验证的用户(几乎所有人都会):
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);
}]);
答案 0 :(得分: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;