繁体   English   中英

AngularJS Promise被拒绝,无需等待异步响应(它应该解决)

[英]AngularJS Promise being rejected without waiting for async response (it should resolve)

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

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

我使用诺言来:

  1. 检查访客是否已经通过身份验证
  2. 如果不是,请尝试对它们进行匿名身份验证
  3. 如果它们成功通过身份验证,请解决承诺(和路由)
  4. 如果验证由于某种原因失败,请拒绝承诺

题:

即使访问者已经成功地匿名身份验证(在上面的步骤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总是被拒绝的原因。

并且您应该知道上面的代码通常称为“ 延迟反模式” 最好使用现有的Promise,而不是使用defer()创建一个新的defer()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM