2013-10-10 57 views
1

我希望能夠從角度服務返回預加載的數據,如果它已經存在,如果它不是我想要從網絡獲取數據服務。

很明顯,其中一個操作是同步的,另一個不是這樣,我想以異步方式包裝簡單的返回,這樣我就不必在控制器中有很多if ... else塊。

我試過使用延期API如下。

worksOrdersApp.factory("WorksOrderService", function ($http, $q) { 
    var _jobs = []; 

    var newWorksOrders = function() { 
     var deferredJobs = $q.defer(); 
     if (_jobs.length === 0) { 
      return $http.get('/api/WorksOrders/GetNew').success(function(data) { 
       deferredJobs.resolve(data); 
      }); 
     } else { 
      deferredJobs.resolve(_jobs); 
     } 

     return deferredJobs.promise; 
    }; 

    return { 
     getNewWorksOrders: newWorksOrders, 
    }; 
}); 

然後在我的控制器,它應該是調用的一個簡單的例子...

WorksOrderService.getNewWorksOrders().then(function (data) { 
    $scope.values = data; 
}); 

這最初似乎工作的data在服務的價值是我期望的數組。但是,當我在調用deferredJobs.resolve()之後檢查控制器中的data的值時,它是一個http響應對象,其中包含狀態碼的詳細信息以及包含該數組的單獨data.data屬性。這仍然意味着我必須有控制器中的if ... else代碼來檢查data是數組還是http響應。

如何將數組傳回控制器?

回答

1

典型的,只要我問這個問題,我就會發現答案。

if (_jobs.length === 0)塊中,我返回$http.get而不是執行它並允許承諾返回結果。

這是我所期望的。

if (_jobs.length === 0) { 
    $http.get('/api/WorksOrders/GetNew').success(function(data) { 
     _jobs = data; // I also forgot this line, without it _jobs will always be empty and the else block will never execute 
     deferredJobs.resolve(data); 
    }); 
} else { 
    deferredJobs.resolve(_jobs); 
} 
相關問題