2014-10-18 39 views
1

我想爲我的http請求創建緩存,所以我想複製$ http回調。

這是我的函數:

function getData() { 
    if(cacheExists()) { 
     return cache; 
    } 

    return $http({ 
      method: 'POST', 
      url: 'http://something.com', 
      params: {something} 
     }); 
} 

,這是我如何處理它:

getData() 
     .success(function(data) { 
      $scope.spot = data.data; 
      console.log($scope.spot); 
     }).error(function(data) { 
      console.log('error'); 
     }); 

這將angularjs $ HTTP方法, 完美地工作,但不會有我的「緩存工作「,因爲」緩存「應該有這些回調:成功&錯誤,我該如何創建它們?

回答

4

它是因爲$ http返回一個承諾。您可以使用$ q服務解決此問題,並將緩存作爲承諾返回。

//inject $q 
function getData() { 
    var deffered = $q.defer() 
    if(cacheExists()) { 
     deffered.resolve(cache); 
    } else { 
     $http({ 
      method: 'POST', 
      url: 'http://something.com', 
      params: {something} 
     }) 
     .success(function(data) { 
     deffered.resolve(data); 
     }) 
     .error(function(response) { 
     deffered.reject(response); 
     }) 
    } 

    return deffered.promise; 
} 

所以這裏發生了什麼,你正在創造「承諾」作爲承諾。 Promise基本上是處理異步任務的一種方式。當你得到承諾時,你需要解決它,就像你從http調用返回的值一樣。但是,如果獲得$ q,則您使用'then'而不是'success'。考慮下面的代碼片段:

getData() 
    .then(function(data) { 
     $scope.spot = data.data; 
     console.log($scope.spot); 
    }) 

希望這會有所幫助。

UPDATE 如您例如通過處理錯誤,你可以這樣做的:

getData() 
    .then(function(data) { 
     if(data.data) { 
      $scope.spot = data.data; 
      console.log($scope.spot); 
     } else { 
      console.log("its an err"); 
     } 
    }); 

或者這

getData() 
    .then(successCallback, errorCallback); 

function successCallback(data) { 
    $scope.spot = data.data; 
    console.log($scope.spot); 
} 

function errorCallback() { 
    console.log("its an err"); 
} 
+0

看起來不錯,但我怎麼現在處理HTTP錯誤? – 2014-10-18 14:29:58

+0

對不起...什麼是$ q,我如何注入他? – 2014-10-18 14:30:44

+0

那麼,如何處理http錯誤可能取決於我猜的用例。在控制器和/或服務中注入$ http的地方注入$ http。你曾經執行getData函數的地方。 – cbass 2014-10-18 14:33:43