当前位置: 首页 > 面试题库 >

AngularJS应用初始化之前的$ http请求?

沈畅
2023-03-14
问题内容

为了确定用户的会话是否已通过身份验证,我需要在加载第一个路由之前向服务器发出$
http请求。在加载每个路由之前,身份验证服务会检查用户的状态以及该路由所需的访问级别,如果未对该用户进行身份验证,它将重定向到登录页面。但是,当首次加载该应用程序时,它并不了解用户,因此,即使他们具有经过身份验证的会话,它也将始终重定向到登录页面。因此,为了解决此问题,我正在尝试向服务器发出用户状态请求,作为应用程序初始化的一部分。问题在于,显然$
http调用是异步的,那么如何在请求完成之前停止应用程序运行?

我对Angular和前端开发总体而言是新手,所以我的问题可能是对javascript而不是Angular的误解。


问题答案:

您可以通过resolve在routingProvider中使用来实现。

这使您可以在启动控制器之前等待一些承诺得到解决。

从文档引用:

resolve-{Object。=}-可选的依赖关系映射,应将其注入到控制器中。如果这些依赖关系中的任何一个是应许的,路由器将在实例化控制器之前等待所有这些依赖关系被解决或被拒绝。如果所有的承诺都已成功解决,则将注入已解决的承诺的值,并触发$
routeChangeSuccess事件。

简单的例子

    app.config(['$routeProvider', function($routeProvider) {
    $routeProvider.
        when('/', {templateUrl: 'home.html', controller: 'MyCtrl',resolve: {
            myVar: function($q,$http){
                var deffered = $q.defer();

                    // make your http request here and resolve its promise

                     $http.get('http://example.com/foobar')
                         .then(function(result){
                             deffered.resolve(result);
                          })

                return deffered.promise;
            }
        }}).
        otherwise({redirectTo: '/'});
}]);

然后,将myVar包含承诺数据注入到您的控制器中。

避免额外的DI参数

您还可以通过返回仍然要注入的服务来避免使用其他DI参数:

app.config(['$routeProvider', function($routeProvider) {
        $routeProvider.
            when('/', {templateUrl: 'home.html', controller: 'MyCtrl',resolve: {
                myService: function($q,$http,myService){
                  var deffered = $q.defer();

                      /*  make your http request here
                      *   then, resolve the deffered's promise with your service.
                      */

                  deffered.resolve(myService),

                  return deffered.promise;
                }
            }}).
            otherwise({redirectTo: '/'});
    }]);

显然,这样做时,您必须将请求的结果存储在共享服务中的任何位置。

看看 Angular Docs /
routeProvider

我从 egghead.io的
那个家伙那里学到了大部分东西 ****



 类似资料:
  • 问题内容: 我有一个AngularJs应用程序,我想在其中一开始就加载消息和应用程序版本,并将它们保存在本地存储中,然后再在控制器中使用它们。我现在所拥有的是每个控制器中的服务调用(目前为三个): 我只想获取一次应用程序版本并将其存储在此处。我不必每次都检查版本,对(如果新版本中添加了新消息)? 我发现使用$routeProvider的建议,但我的应用程序不是SPA。所以我需要其他想法/建议。对你

  • 我试图理解@bolov对删除默认构造函数问题的第一个公认答案。对象仍然可以创建......有时[1] 似乎我发现了一个错误,所以它搞乱了整个解释。 @bolov解释了为什么这段代码能够在c 11中成功编译: 场景A 以及为什么这段代码无法在c 11中编译: 场景C 他说,重点是第一个foo是聚合,第二个foo不是聚合。 然后他给出了cppreference的摘录: T类型对象的列表初始化的影响是:

  • 我找不到任何关于这个具体案例的具体SO帖子,所以我想问一下我认为是/否的问题。 以下是JLS§12.4.2(Java SE 8),清单6-7: 我的问题是:这是否意味着子类的final static变量在超类的静态初始化之前初始化(假设final static作为其声明的一部分初始化)?

  • 你已经有了基本的页面布局和需要用的CSS以及JS文件。现在我们需要初始化我们的应用,比如在 my-app.js中 var myApp = new Framework7(); 上面这个例子中我们使用了 myApp 作为变量名存储 Framework7 初始化之后的实例。 这样初始化非常简单,但是Framework7 也提供了更多个性化的定制,只需要在初始化的时候传入一个配置对象即可。 var myA

  • 问题内容: 我有一个使用AngularJS的phonegap应用程序。 在我的应用程序上,我正在使用NetworkStatus插件来确认手机正在使用的连接类型。 在我的根路由上,我正在解析对服务的调用,该调用调用DeviceService,它负责访问navigator.network.connection.type并确定连接是打开还是关闭。解决方案(通过路由解析功能)将一个connectionSt

  • 例如:- 我想在我的应用程序初始化的时候设置这个常数,并且能够在我的组件之间共享这个常数。 什么是实现这一目标的最佳方法?