angular - $ http第一次调用超级慢

时间:2014-01-24 17:50:09

标签: javascript angularjs http

控制器有$ http,可以在Flask上调用api后端。我有一些基本的身份验证和crossdomain设置。第一次进入cpuListCtrl控制器时,$ http调用需要cca。 〜14sec。下次我以角度访问控制器时只需要23ms。但每次按下浏览器刷新,回到~14秒。来自浏览器的直接api调用也只需要23ms。所以我的问题是我需要这么长时间,我是否会错过一些东西,或者我应该具体看哪一个?

编辑:更新了代码以反映最近的更改:

  var app = angular.module('RecycleApp', ['ngRoute', 'appControllers']);
    app.config(['$httpProvider', function($httpProvider) {
     $httpProvider.defaults.useXDomain = true;
     delete $httpProvider.defaults.headers.common['X-Requested-With'];
   }
  ]);

  app.config(['$routeProvider', function($routeProvider){
  $routeProvider
    .when("/cpu", {
        templateUrl:'static/js/partials/cpu.html',
        controller:'cpuCtrl'
    })
  }]);

  var appControllers = angular.module('appControllers', []);

  appControllers.controller('cpuCtrl', ['$scope','$http',
function($scope,$http){
    $http({
        url: 'http://SOME_IP/api/v1/cpus',
        method: 'POST',
        data: JSON.stringify({"latitude":46.1948436, "longitude":15.2000873}),
        headers: {"Content-Type":"application/json"}
    })
    .success(function(data,status,headers,config){
        console.log(data.list);
        $scope.cpus = data.list;
    })
    .error(function(data,status,headers,config){
        console.log("something went wrong.");   
    })

 }]);

服务器端:

@app.route('/api/v1/cpus', methods=["GET"])
@cross_origin(origins='*', headers=("Content-Type"))
def get_cpu_list():
    result = session.query(RecycleReUseCenter)\
            .options(load_only("Id", "CpuName"))\
            .all()
    return list_json(result)

@app.route("/api/v1/cpus", methods=["POST"])
@cross_origin(origins='*', headers=("Content-Type"))
def get_cpu_list_with_locations():
    content = request.get_json(force=True)
    given_latitude = content['latitude']
    given_longitude = content['longitude']

    result = RecycleReUseCenter.get_all_with_distance(given_latitude, given_longitude)
    return list_json(result)

3 个答案:

答案 0 :(得分:0)

您确定http呼叫何时开始?角度应用程序可能会卡在其他位置,并且仅在最后一秒内进入http调用。例如 - 在配置中,您使用的是“令牌”,您从哪里获取它?在许多有角度的应用程序中,这是从一些oauth服务中提取的,在一个单独的调用中。在配置http之前,您的慢速呼叫将无法启动。在令牌出现后,下一次调用会更快,因为我们已经获得了令牌。

为限制某些猜测,您可以使用像charles这样的代理工具 - 或者deflect.io chrome扩展程序来监视所有即将发出的http调用并计算出来

答案 1 :(得分:0)

我最近遇到了同样的问题,发现奇怪的延迟实际上似乎是在Flask端,但只有在使用Chrome中运行的Angular应用时才会发生。来自python stackexchange论坛的答案是我见过的最好的答案 - https://stackoverflow.com/a/25835028/1521331 - 它提供了一个解决方案'如果不是对这个谜的解释,那就是各种各样!

答案 2 :(得分:0)

我遇到了同样的问题,以上都没有为我工作。这是做了什么:

Slow Requests on Local Flask Server

实际上,某些浏览器会尝试在IPv4之前访问IPv6套接字。在注释掉/ etc / hosts中的违规行并重新启动apache之后,问题就解决了。