AngularJS的承诺在没有等待异步响应的情况下被拒绝(它应该会被解析)
AngularJS Promise being rejected without waiting for async response (it should resolve)
在我的场景中,当访问者第一次导航到一个页面(或路由)时,他们应该匿名身份验证(我使用的是Firebase)。上下文;之后,访问者可能会在登录后迁移他们的匿名会话,例如使用Facebook。
如果匿名身份验证由于某种原因失败,它们将被重定向到错误页面(路由)——少数不需要任何身份验证的页面之一。
我正在使用promise to:
- 检查访问者是否已通过身份验证
- 如果不是,请尝试匿名验证
- 如果认证成功,解析承诺(和路由)
- 如果由于某种原因认证失败,拒绝承诺
问题:
承诺总是在访问者第一次导航到需要身份验证的页面(路由)时被拒绝,即使访问者已经匿名身份验证成功(在上面的步骤2中);为什么会发生这种情况?
下面我包含了我的代码,并添加了一个注释来突出显示可能导致问题的部分。
谢谢你的帮助,它总是感激!
var app = angular.module('vo2App', ['firebase', 'ngCookies', 'ngRoute']);
app.config(['$locationProvider', '$routeProvider', function ($locationProvider, $routeProvider) {
$routeProvider
.when('/', {
controller: 'HomeCtrl',
templateUrl: '/views/home.html'
})
.when('/login', {
controller: 'LoginCtrl',
templateUrl: '/views/login.html'
})
.when('/oops', {
controller: 'OopsCtrl',
resolve: {
currentAuth: function (){
return null;
}
},
templateUrl: '/views/oops.html'
});
}]);
app.run(['$location', '$rootScope', 'Auth', 'ErrorMsg', function ($location, $rootScope, Auth, ErrorMsg) {
$rootScope.$on('$routeChangeError', function (event, next, prev, error) {
if (error === 'AUTH_REQUIRED') {
ErrorMsg.add('Unauthorized');
// TODO: Make all error messages constants
$location.url('/oops');
}
});
$rootScope.$on('$routeChangeStart', function (event, next, current) {
if (! ('resolve' in next)) {
next.resolve = {};
}
if (! ('currentAuth' in next.resolve)) {
next.resolve.currentAuth = function ($q, Auth) {
var deferred = $q.defer();
Auth.$requireAuth().then(deferred.resolve, function () {
/* ** The following line seems to be causing the problem ** */
Auth.$authAnonymously().then(deferred.resolve, deferred.reject('AUTH_REQUIRED'));
});
return deferred.promise;
};
}
});
}]);
deferred.reject
不作为错误函数传递给then
,每次都调用
Auth.$authAnonymously().then(deferred.resolve, deferred.reject('AUTH_REQUIRED'));
这就是为什么deferred.promise
总是被拒绝。
您应该知道上面的代码通常被称为延迟反模式。最好使用已有的承诺,而不是使用defer()
创建一个新的承诺。
相关文章:
- 如何在未直接触发的情况下停止事件
- 在不使用JQuery的情况下隐藏DOM中的选定元素
- 在不使用jquery的情况下查找页面中的所有锚点并附加函数
- 在不打开聊天屏幕的情况下制作Zopim-ding代理
- 在不阻止默认行为的情况下检测IE10中的缩放
- 如何在不传递此信息的情况下查找被调用的元素
- 如何在不刷新页面的情况下更新显示框
- 有没有一种方法可以在控制台关闭的情况下让console.log()在IE中记录消息
- JavaScript-在手机上不工作的情况下,在外部单击时隐藏元素
- 在我的情况下,如何进行http请求
- 在不知道深度或父属性的情况下从对象中删除属性
- 在不破坏未定义函数的情况下,对多个视图使用单个js文件
- ROR:如何在不重新加载浏览器的情况下从控制器获取参数
- 如何在不影响其他元素的情况下扩展DIV
- 如何在内联依赖项并将图像转换为dataURI的情况下完全提取网页
- 在不移动内部文本的情况下缩放元素的效果
- 在什么情况下浏览器拒绝继续调用 setInterval 回调
- 得到"SCRIPT70:许可被拒绝”;仅在EDGE浏览器/JJAVASCRIPT错误的情况下
- Ajax在非常奇怪的情况下拒绝发送数据
- AngularJS的承诺在没有等待异步响应的情况下被拒绝(它应该会被解析)