我是角度框架的新手,对构建控制器有疑问。
我有角度控制器,它几乎没有服务调用,每个服务调用都返回一个承诺。每个调用都需要(依赖于)前一个调用的数据。
甚至多达三个这样的调用将我的控制器转换为嵌入在 then() 中的丑陋的纠结的 then() 块。
例如考虑一个场景
- 加载谷歌地图
- 获取用户的当前位置
- 在当前位置的地图上显示一个标记
控制器定义为
angular.module('app')
.controller('mapCtrl', ['mapService', function(service){
var initResult = service.init();
initResult.then(function(map){
//01. init succeeded
var currentLocation = service.currentLocation();
currentLocation.then(function(currentLocation){
//02. current location succeeded
var addMarker = service.addMarker(currentLocation, map);
addMarker.then(function(){
//03. added marked
}, function(){
//03. failed added marked
});
}, function(){
//02. current location failed -> render some location
});
},
function(){
//01. init failed
});
}]);
这些操作隐藏在服务背后,因为我仍然不确定我们是继续使用谷歌地图还是打开街道地图或必应。
我尝试了什么基于状态的结果对象
angular.module('app')
.controller('mapCtrl', ['mapService', function(service){
/* handle add marker*/
var addMarkerResult = {
success: {},
failure: {}
};
/* handle get current locations */
var fetchLocationResult = {
success: function(){
_service.addMarker(addMarkerResult.success, addMarkerResult.failure);
},
failure: function(){}
};
/* handle map initialization */
var initMapResult = {
success: function(){
_service
.currentLocation(fetchLocationResult.success,
fetchLocationResult.failure);
},
failure: function(){}
};
service.init().then(initMapResult.success, initMapResult.failure);
}]);
问题 :
- 有没有更好的方法来处理代码而不是处理异步结果?
- 有没有我不知道的更简单的方法?