【问题标题】:AngularJS $http response long executionAngularJS $http响应长执行
【发布时间】:2013-08-31 15:44:57
【问题描述】:

我正在使用 Angular 和 $http 请求从服务器获取数据。它是同一服务器目录中的模拟数据,但它会在 20 秒内返回响应。这是很长的路。该请求在应用程序启动时执行。 我尝试使用 jQuery $.ajax 执行相同的查询,它在 10 毫秒内工作。但我想摆脱 jQuery。 为什么 AngularJs $http 花了这么长时间?

我正在使用 Ifeanyi Isitor 的 Lazy Loading In AngularJS 示例如何将 require.js 与 angular 一起使用。加载我的第一个视图的控制器指向执行查询的服务。在 chrome 开发工具网络跟踪中,我发现 10 毫秒获取文件所需的时间更少。但是在执行查询之前使用console.time设置它并在成功时结束它承诺它会记录大约20000毫秒。可能是因为延迟加载吗?但为什么 jQuery 工作得很快?这是我的服务代码

define(['appModule'], function(app) {
  app.lazy.factory('daoService', ['$http', function($http) {
    var ...
    ...
    getChanges = function(tableName, modifiedSince, callback) {
        console.log('data access time starts');
        console.time('data access time');
        // this works in 20000 ms
        $http.post(tablesUrl[tableName]).success(function(data) {
                console.log("The server returned " + data.length + " changes);
                console.timeEnd('data access time');
                callback(data);
            }).error(function(data){
                console.log(data);
            });

        /* this works in about 10 ms
        $.ajax({
            url: tablesUrl[tableName],
            dataType:"json",
            success:function (data) {
                console.log("The server returned " + data.length + " changes );
                console.timeEnd('data access time');
                callback(data);
            },
            error: function(model, response) {
                console.log(response);
            }
        });*/
    },

【问题讨论】:

  • 通常 AngularJS 非常快。请提供一些代码
  • 不看代码就不可能知道发生了什么,但 Angular 不是罪魁祸首。
  • 你的服务器是罪魁祸首。不是 Angular。
  • 它也可能是在前端锁定的东西。请提供一些代码帮助
  • 添加了一些代码结束说明

标签: javascript json angularjs


【解决方案1】:

我找到了答案。 我是因为必须调用 Angular 中的某些东西才能执行。为此,我们需要使用 $apply。代码如下:

define(['appModule'], function(app) {
    app.lazy.factory('daoService', ['$http', '$rootScope', function($http, $rootScope) {
    var ...
    ...
    getChanges = function(tableName, modifiedSince, callback) {
        $rootScope.$apply(function(){
                $http.post(tablesUrl[tableName], params).success(function(data) {
                    callback(data);
                }).error(function(data){
                    console.log(data);
                    phoneGapApp.showAlert(data.message);
                });   
            });
    },

更多关于$apply的信息Jim Hoskins's post

【讨论】:

  • 只有在从 Angular 外部调用 getChanges(即从 jQuery 事件或类似事件)时才需要这样做。
  • 是的,它被实现为用于访问数据的服务,并且显然它超出了 Angular 的范围。从控制器调用它以从 SQLite 获取数据并从服务器同步数据。它在链条中的某个地方脱离了 Angular。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-16
  • 2015-09-15
  • 1970-01-01
相关资源
最近更新 更多