如何全局解析依赖项(从服务器预加载当前用户)

How to globally resolve a dependency (preload current user from server)

本文关键字:加载 用户 服务器 何全局 依赖      更新时间:2023-09-26

我知道我可以根据路由解决控制器的某些依赖关系。但是,我有一个我一直想要解决的服务:当前用户。

该服务基本上为当前用户向服务器发出 get 请求(url 类似于 /api/user/me ),并返回一个包含用户 ID、名称等的对象。它目前被缓存并返回 promises,所以我想在任何地方使用它,我都必须做这样的事情:

CurrentUser.getCurrentUser().then(function(user) {
    // use user.id here
});

为已加载的数据创建额外的、不必要的嵌套和回调层。有没有一种很好的方法可以全局预加载用户,这样我就可以在任何地方使用它,而不必等待承诺?

类似于我上面链接的路由解析的路线,除了它应该适用于所有路由,也可能适用于服务。

我想象一个这样的结果:

// somewhere
AlwaysResolveThisBeforeDoingSomething(UserService.resolve);
// In my controller
.controller('CurrentUserCtrl', function ($scope, $http, CurrentUser) {
    // CurrentUser is an initialized user containing id, name etc.

一种选择是让它完成。 您的服务可以具有用户属性,您可以根据需要绑定到该属性。 这就像在服务填充信息之前将所有内容视为未经身份验证的用户。

如果在生成页面时它可用,为什么不将其包含在 HTML 中或作为 <SCRIPT> 标记? 在 ASP.NET MVC 中,您可以执行以下操作:

public ActionResult UserScript()
{
    var user = new { 
        id = 1,
        name = "jason"
    };
    string s = string.format("var my = {{ user: {0} }};", 
            JsonConvert.SerializeObject(user));
    return JavaScript(s);
}

它将以与页面上的任何脚本相同的顺序加载,具体取决于您放置它的位置,但您可以将其放在脚本之后,因为在角度引导之前,该值无关紧要。 在这里,我只是简单地设置值,但您可以将其作为服务的一部分。

<div ng-app ng-controller="MyCtrl">
    <script type="text/javascript">
        function MyCtrl($scope) {
            $scope.user = my.user;
        }
    </script>
    <h3>You are: {{user.name}}</h3>
</div>
<script type="text/javascript" src="@Url.Action("UserScript", "Test")"></script>

您正在使用$http所以我将使用拦截器解决此问题。

摘自 angularjs 文档部分拦截器 http://docs.angularjs.org/api/ng.$http

用于全局错误处理、身份验证或任何类型的 请求的同步或异步预处理或 响应的后处理,希望能够拦截 请求在传递给服务器之前,在之前响应 它们被移交给启动这些内容的应用程序代码 请求。拦截器利用承诺 API 来实现这一点 需要同步和异步预处理。

您可以从以下内容开始: http://plnkr.co/edit/td0jyy3j3rTAx1mZifjy?p=preview您需要在本地服务器上测试此代码,并将服务器配置为发送 401 未授权响应。