Http调用在angular.js中发生两次

时间:2016-10-20 12:20:29

标签: angularjs api cookies call

$http is getting called multiple times in AngularJS

可能重复

对不起,我没有50个声誉对同一篇文章发表评论。 我们使用http服务调用api,并且所有服务都具有通过cookiestore值传递的会话ID。 api调用第一次不起作用,因为在第一次调用期间会话id为空,并且它仅适用于第二次调用。

任何人都可以帮助我们。我们有多个api,并且都发生了两次,这实际上增加了负载。是的,我们已经研究过了。

Router.js

    angular.module('adminsuite',['ngFileUpload','ui.router','ngCookies','angular-clipboard','ngAnimate', 'ngSanitize', 'ui.bootstrap','ngMessages']).constant("__env",env).config(function($stateProvider, $urlRouterProvider, $locationProvider) {

$urlRouterProvider.otherwise('/');
//$locationProvider.html5Mode(true);
$stateProvider
    .state('login', {
        url: '/',
        views:{
            header:{
                templateUrl: '',
                controller: ''
            },
            pageContent:{
                templateUrl: 'Login/login3.html',
                controller: 'loginController'
            },
            footer:{
                templateUrl: 'common/footer3.html',
                controller: 'footerController'
            }
        }



    })

    // HOME STATES AND NESTED VIEWS ========================================
    .state('dashboard', {
        url: '/dashboard',
        views:{
            header:{
                templateUrl: 'common/header.html',
                controller: 'headerController'
            },
            pageContent:{
                templateUrl: 'dashboard/dashboard.html',
                  controller: 'dashboardController'
            },
            footer:{
                templateUrl: 'common/innerFooter.html',
                controller: 'footerController'
            }
        }
    })
    //SURVEY STATES
    .state('survey', {
        url: '/survey',
        views:{
            header:{
                templateUrl: 'common/headerTool.html',
                controller: 'headerController'
            },
            pageContent:{
                templateUrl: 'survey/survey.html',
                  controller: 'surveyController'
            },
            footer:{
                templateUrl: 'common/innerFooter.html',
                controller: ''
            }
        }
    });

    // ABOUT PAGE AND MULTIPLE NAMED VIEWS =================================

 })

LoginAuthenticationService.js

UserService.GetByUsername(requestData)
            .then(function (user) {
                console.log(user);
                if (user.SessionID) {
                   sessionID = user.SessionID;
                   userDetails = user.UserProfile;
                   response = { success: true};
                } else {
                    response = { success: false, message: 'Username or password is incorrect' };
                }
                callback(response);
            });

UserService.js

function GetByUsername(user) {
    //console.log(__env.apiUrl);
    return $http.post(__env.apiUrl+'/UserAuthentication/login',  user, {headers: { 'Content-Type': 'application/json'}}).then(handleSuccess, handleError('Error getting user by username'));
}

Api.js

 $http.get(__env.apiUrl+'/UserSurvey/GetAllSurveys',  {
                            headers: { 'Content-Type': 'application/json','SessionID':$rootScope.token}
                                })
                .then(function(response){
                        console.log(response);
                            return response.data;
                        }, function(error){
                             console.log("error");
                              console.log(error);
                            return error;
                        });

任何帮助表示感谢。

2 个答案:

答案 0 :(得分:0)

您可能遇到了摘要周期问题。

当我的AJAX模块位于普通Javascript中时,我的数据会在第一个服务器查询中呈现。但是,当我将AJAX模块放在AngularJS模块中时,我必须在数据呈现之前查询服务器两次。请注意,从UI调用查询。

在探索之后,我意识到数据确实已经到达第一个查询,并被分配给所有指定的对象和变量,但仅限于AngularJS代码的范围内。当然,数据是异步到达的,UI已经经历了一个摘要周期,没有理由再去,因为UI中的任何内容都没有改变。当UI发生变化时,Angular会更新所有内容,但在更改(到达数据)来自服务器时不执行任何操作。

随后,第二个相同的查询将强制使用摘要周期,并使用第一个查询中已经存在的数据更新所有绑定。 因此,目标是强制从Javascript的摘要周期更新您的UI绑定。我现在在回调函数结束时强制执行摘要循环。 要强制进行摘要循环,请在完成数据变量赋值后放置Angular方法$scope.$apply([exp])。我在Angular文档中找到了有用的详细信息:https://docs.angularjs.org/api/ng/type/$rootScope.Scope#$apply以及对http://jimhoskins.com/2012/12/17/angularjs-and-apply.html的工作示例的一个很好的解释,以及在强制摘要周期时使用“控制器为”语法的重要细节:{ {3}}并希望这可以解决双重HTTP调用的问题。

答案 1 :(得分:0)

假设您已使用AngularUI状态定义在应用程序中声明了控制器,例如:

$stateProvider
 .state('index',
 {
   url          :   '/',
   templateUrl  :   'templates/home.html',
   controller   :   'HomeController'
 })

然后,在home.html视图模板中,您还使用ng-controller指令声明控制器,如下所示:

<div ng-controller="HomeController">

然后,您没有意识到,却将控制器连接了两次(一次通过状态定义,两次通过ng-controller指令),这导致控制器中包含的代码也执行两次。