我在角度服務中承諾存在問題。我有一個方法getArea
服務,它應該返回服務區的名稱。該服務從API獲取服務區域。當getArea
獲得服務區時,它會找到所請求區域的名稱,並將其返回。但是,我的代碼不起作用 - 我陷入了無限循環。我想我誤解了如何使用承諾?
SupplierService:
var servicePromise;
var getServices = function(){
if(!servicePromise){
servicePromise = $http.get('/api/services')
.then(function(res){
return res.data.data;
});
}
return servicePromise;
};
var myService = {
getServices : getServices,
getArea : function(questionnaireId){
getServices().then(function(services){
// ...
return "hello world";
});
}
};
return myService;
控制器:
$scope.supplierService = SupplierService;
查看:
<div>
<b>Area:</b> {{ supplierService.getArea(r.questionnaireId) }}
</div
我想到的看法顯示「區域:你好世界」,但進入無限循環。
更新1:我已經加入getServices
作爲服務大衆的功能,並且可以從控制器這樣的訪問:
SupplierService.getServices().then(function(d){
$scope.services = d;
});
所以我想這個問題是在getArea
方法?
更新2:我被這個答案https://stackoverflow.com/a/12513509/685352啓發。我想緩存結果。
更新3:這裏是一個plunker。如果您嘗試從視圖中訪問supplierService.getArea(100)
- 瀏覽器將不會響應。
+1 $ q服務,Angular的精益承諾服務將被注入。你當然可以返回__ $ http.get('/ api/services')__,因爲它已經是一個承諾。 – cbayram
好點的cbayram,我傾向於這樣做,並使用一個對象來檢查,如果我已經加載數據(存儲每個服務調用的屬性,我將在服務中知道數據是否加載) ,我想我已經習慣了「明確地」這樣做,但就像你說的使用從get返回的HttpPromise我想象的是一個很好的解決方案。 – shaunhusain
「getArea」方法不是問題嗎?實際上,我也返回getServices方法,並在異步調用返回時在控制器中獲取服務。 – swenedo