gpt4 book ai didi

javascript - AngularJS Promise 被拒绝而不等待异步响应(它应该解决)

转载 作者:行者123 更新时间:2023-11-28 19:01:36 27 4
gpt4 key购买 nike

在我的场景中,当访问者第一次导航到页面(或路线)时,他们应该进行匿名身份验证(我使用的是 Firebase)。对于上下文;稍后,访问者可以在登录后迁移其匿名 session ,例如使用 Facebook。

如果匿名身份验证由于某种原因失败,它们将被重定向到错误页面(路由)——少数不需要任何身份验证的页面之一。

我使用 promise 来:

  1. 检查访问者是否已通过身份验证
  2. 如果不是,请尝试对他们进行匿名身份验证
  3. 如果身份验证成功,则解析 promise (和路由)
  4. 如果由于某种原因身份验证失败,则拒绝 promise

问题:

当访问者第一次导航到需要身份验证的页面(路由)时,即使访问者已成功通过匿名身份验证(在上面的步骤 2 中), promise 似乎总是被拒绝;为什么会发生这种情况?

下面我包含了我的代码,并添加了注释以突出显示似乎导致问题的部分。

感谢您对此的帮助,我们始终不胜感激!

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 总是被拒绝。

你可能应该知道上面的代码通常被称为 deferred antipattern 。最好使用现有的 Promise,而不是使用 defer() 创建新的 Promise。

关于javascript - AngularJS Promise 被拒绝而不等待异步响应(它应该解决),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32436159/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com