2013-08-28 73 views
2

我正在使用Angular和$ http請求從服務器獲取數據。它在同一個服務器目錄中模擬數據,但在20秒內返回響應。這是很長的路要走。該請求在應用程序啓動時執行。 我試圖使用jQuery $ .ajax執行相同的查詢,並且它在10 ms內工作。但我想擺脫jQuery。 爲什麼AngularJs $ http需要這麼長時間?

我正在使用Ifeanyi Isitor's Lazy Loading In AngularJS示例如何使用帶角度的require.js。加載我的第一個視圖的控制點指向執行查詢的服務。在鉻開發工具網絡traking我看到它需要少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); 
      } 
     });*/ 
    }, 
+0

通常AngularJS是非常快的。請提供一些代碼 – tschiela

+0

您的服務器是罪魁禍首。不是角度。 – Abilash

+0

它也可能是鎖定在前端的東西。請提供一些代碼來幫助 – bdavidxyz

回答

1

我找到了答案。 我是因爲角度中的某些東西必須被調用才能執行。爲此我們需要使用$ 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); 
       }); 
      }); 
    }, 

更多關於$適用於Jim Hoskins's post

+0

這應該只在'getChanges'是從Angular之外調用(即從jQuery事件或類似的東西)調用時才需要。 –

+0

是的,它被實現爲訪問數據的服務,顯然它不在Angular中。它從控制器調用來從SQLite獲取數據並從服務器同步數據。它在鏈條的某個地方擺脫了Angular。 – Ricardas