AngularJS(Restangular):做出承诺块?需要使用它来验证令牌

AngularJS(Restangular):做出承诺块?需要使用它来验证令牌,angularjs,angularjs-routing,restangular,Angularjs,Angularjs Routing,Restangular,我偶然发现Restanglar打电话给一家休息服务公司。它工作得很好,并且回报了一个承诺。我需要有呼叫阻塞功能。原因是在一个新的页面重新加载,我技术上没有登录,但我可能有一个令牌存储在cookie中。我想根据rest服务验证此令牌。问题是我需要它来阻止 如果超时发生或无效,我可以将该用户视为未经身份验证 这就是想要阻止的原因,因为我想使用$location.path将它们重定向到一个新的URL,因为它不是有效的令牌 这不会发生在特定的路线上,所以我不能使用正在阻塞的resolve。从技术上讲,它

我偶然发现Restanglar打电话给一家休息服务公司。它工作得很好,并且回报了一个承诺。我需要有呼叫阻塞功能。原因是在一个新的页面重新加载,我技术上没有登录,但我可能有一个令牌存储在cookie中。我想根据rest服务验证此令牌。问题是我需要它来阻止

如果超时发生或无效,我可以将该用户视为未经身份验证

这就是想要阻止的原因,因为我想使用$location.path将它们重定向到一个新的URL,因为它不是有效的令牌

这不会发生在特定的路线上,所以我不能使用正在阻塞的resolve。从技术上讲,它发生在每个路由上-我使用$on.$routeChangeStart并检查内部变量Get LoggedIn与否,如果未登录,我检查存储的令牌

这会在每次页面刷新时发生,但不会在应用程序内部导航时发生

我试图得到的影响是Gmail的工作方式

期待任何人对此有任何见解


谢谢

我认为最好的方法可能是使用$location.path推送用户,您可以使用.then()将用户留在加载页面上,从而有效地强制等待

var currentPath = $location.path();

$location.path(loadingScreen);

//Assuming you have some sort of login function for ease.
Restangular.login(token).then(
    function(result) {
        $location.path(currentPath)
    },
    function(error) {
        $location.path(logInScreen)
    }
);

如果您使用的是ui路由器,您可以移动到具有相同URL的另一个状态,在该状态下,您将使用Restangular.login,然后,如果成功,则返回“登录”状态,否则,转到“登录”状态,用户必须输入其用户名和密码

如果您不使用ui路由器,您可以通过一些
ng交换机
实现类似的功能

因此,在到达屏幕时,您可以执行
Restangular.login
,默认情况下,您可以通过将一些布尔值设置为true来显示加载页面。然后,如果不成功,您将他发送到登录,否则,您将加载设置为false并显示页面

无论如何,我强烈建议使用ui路由器,它会震动:)


希望这能奏效

基本上,您需要确保在发生任何路由更改之前发生一些异步操作,在这种情况下,该操作是对用户进行身份验证

您可以使用发出的
$routeChangeStart
事件向路由上的
解析
对象添加属性,如下所示:

function authenticate() {
    if ( user.isAuthenticated ) {
        return;
    }
    // Just fake it, but in a real app this might be an ajax call or something
    return $timeout(function() {
        user.isAuthenticated = true;
    }, 3000);
}

$rootScope.$on( "$routeChangeStart", function( e, next ) {
    console.log( "$routeChangeStart" );
    next.resolve = angular.extend( next.resolve || {}, {
        __authenticating__: authenticate
    });
});
由于angular将在继续之前等待
resolve
对象中的任何承诺得到满足,因此您可以像示例中那样使用伪依赖项。使用类似的方法,您应该能够保证在任何路由成功执行之前,您的用户正在进行身份验证


示例:

谢谢Matt,这听起来像是我需要的,但是$location.path(加载屏幕)会改变浏览器的地址栏。不管怎样,围绕着这个?很好!,这就是我要找的。