2015-06-14 61 views
0

我發送一個ajax請求來從服務器獲取數據並將其存儲在本地變量中。這是內部服務。然後在控制器中,我使用承諾在需要時獲取數據。它第一次工作,因爲沒有檢測到緩存,並承諾返回,但下一次開始,我沒有從服務函數返回任何承諾,因此JavaScript錯誤。AngularJS繞過承諾,如果數據存在於緩存中

我的服務功能是:

getProductDetails: function(product) { 
     if(!productDetailsArr[product.id]) { 
      if (!promiseProductDetails) { 
       // $http returns a promise, which has a then function, which also returns a promise 
       promiseProductDetails = $http.get(product.id + '/productdetails.json').then(function(response) { 
        productDetailsArr[product.id] = response; 
        return productDetailsArr[product.id]; 
       }); 
      } 
      // Return the promise to the controller 
      return promiseProductDetails; 
     } else { 
      return productDetailsArr[product.id]; 
     } 

    } 

在控制器我有下面的代碼調用上面的函數:

ServiceData.getProductDetails($scope.product).then(function(data) { 
    $scope.productDetails = data; 
}); 

所以在第二次起,我得到JS錯誤:

TypeError: ServiceData.getProductDetails(...).then is not a function 

任何想法如何解決這個問題。

回答

5

你應該做的是始終回報一個承諾。在這種情況下,您可以簡單地返回已經解決的承諾。您可以閱讀關於here的更多信息。

if(!productDetailsArr[product.id]) { 
     if (!promiseProductDetails) { 
      // $http returns a promise, which has a then function, which also returns a promise 
      promiseProductDetails = $http.get(product.id + '/productdetails.json').then(function(response) { 
       productDetailsArr[product.id] = response; 
       return productDetailsArr[product.id]; 
      }); 
     } 
     // Return the promise to the controller 
     return promiseProductDetails; 
    } else { 
     var deferred = $q.defer(); 
     deferred.resolve(productDetailsArr[product.id]); 
     return deferred.promise; 
    } 
+0

工作在第一次去,不得不注入$ q雖然。 – Sandeep

+1

else塊可能更短:'return $ q.when(productDetailsArr [product.id]);' – Styx