在角度控制器中处理来自服务的多个承诺

时间:2014-06-30 18:21:01

标签: angularjs angular-promise

我是角度框架的新手,对构造我的控制器有疑问。

我有一个角度控制器,它可以进行很少的服务调用,每个服务都会返回一个承诺每个呼叫都需要(依赖)前一次呼叫的数据。

即使多达三个这样的调用将我的控制器转换为一个丑陋的嵌入然后嵌入的那个()。

例如,考虑

的场景
  1. 加载谷歌地图
  2. 获取用户的当前位置
  3. 在地图上的当前位置显示标记
  4. 控制器定义为

    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
       });
    }]);
    

    行动隐藏在服务背后,因为我仍然不确定我们是否继续谷歌地图或开放街道地图或bing。

    我尝试了基于状态的结果对象

    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);
    
    }]);
    

    问题:

    1. 使用代码处理异步结果时,是否有更好的方法来执行此操作?
    2. 有没有更简单的方法可以做到这一点,我不知道?

0 个答案:

没有答案