2016-03-29 91 views
1

信息我有一個工廠,我是從一臺服務器使用$ HTTP方法獲取數據:角JS節省從工廠AJAX請求

.factory('$factory', function ($q, $http, $timeout, $state, $ionicHistory, $localstorage) { 
    var obj = []; 

    var functions = { 
    getData: function() { 

     var dfd = $q.defer(); 
     if(!obj){ 
     $http({ 
      url: remoteUrl+'/getdata', 
      method: 'POST', 
      data: {} 
     }).then(function(response) { 
      $timeout(function(){ 
      obj = response.data; 
      dfd.resolve(response.data); 
      }, 2000) 
     }, function(response) { 

     } 
     }else{ 
     return obj; 
     } 
     return dfd.promise; 
    } 
    } 
} 

所以這個獲取數據,並把它放在一個對象。糾正我,如果我錯了,但這種使用工廠這種類型的行動的方法是它不綁定到控制器,並可以在我的應用程序的任何地方使用。

考慮到這一點,我希望能夠這樣做,以便我可以在應用程序中的任何位置獲取數據,而無需每次都查詢服務器。即一旦查詢了服務器,工廠就會保存對對象的響應(就像我現在所做的那樣)。但是,例如,在另一個控制器中訪問數據時遇到問題。

我已經開始通過使用if(!obj)行來使它看起來應該看起來像,但在else語句中,我似乎不能返回obj對象。它會拋出錯誤,因爲它沒有像預期的那樣返回一個承諾。

我不確定我是否甚至沿着正確的路線。

感謝

+0

您可能會發現這個SO文章有用:http://stackoverflow.com/questions/33968655/how-can-i-use-my-json-without-triggering-a-新的API請求,每次,我想學う/ 33969521#33969521 – sjokkogutten

回答

1

這應該工作: Insteada指定的obj = []分配爲空。通常我更喜歡回調。你可以試試這個代碼:

.factory('$factory', function($q, $http, $timeout, $state, $ionicHistory, $localstorage) { 
var obj = []; 

var functions = { 
    getData: function(cb) { 
     // instead of checking !obj you have to check for length or you have to set obj as null 
     if (obj && obj.length == 0) { 
      $http({ 
       url: remoteUrl + '/getdata', 
       method: 'POST', 
       data: {} 
      }).then(function(response) { 
        obj = response.data; 
        cb(response.data) 
       }, function(response) { 

       } 
      } 
      else { 
       cb(obj) 
      } 
     } 
    } 
    } 
}) 
// You can use callback by following code 

    $factory.getData(function(response){ 
    // response will come here 
    })