2013-06-25 102 views
1

我有我真的不明白:)角,承诺和异步功能

我写了一个角的服务,打电话给我的API,重新格式化结果,并把这个数据到另一个功能转变为角控制器的问题。 我这么做很多次,但今天出了点问题。

重新格式化,结果和访问控制器的数据不一样,我不知道(也许明白)为什么:d

这是服务的代码:

myApp.factory('apiService', function($http) { 
var myService = { 
    getMunicipalityAsync : function(id) { 
     var promise = null; 
     promise = $http({ 
      method: 'GET', 
      url: '/api2/cc/municipality/' + id 
     }).success(function(response) { 
      var r = { 
       'success': true, 
       'data': response.data 
      }; 
      console.debug(r, 'return this'); 
      return r; 
     }).error(function(data, status, headers, config) { 
      logError("[apiService], getMunicipalityAsync() error, with status: " + status); 
     }); 
     return promise; 
    } 
} 
return myService; 
}); 

这是代码放入角度控制器。

apiService.getMunicipalityAsync($scope.conf.geoarea).then(
    function(d) { 
     console.debug(d, 'return from service'); 
    }, function(error) { 
     alert('error'); 
    }); 

调试DATAS是不一样的:( look

感谢

回答

3

这两种方法的成功和错误是$ HTTP具体方法是在文档解释: http://docs.angularjs.org/api/ng。 $ http

这些方法的成功和错误获得4个参数:数据,状态,头文件和配置,但正常的承诺方法只会得到一个对象。在你的代码中,你实际上可以看到getMunicipalityAsync函数中的参数“d”包含属性数据,状态,头文件和配置文件。 这也在文档中明确提到:

“由于调用$ http函数的返回值是一个承诺,您还可以使用then方法来注册回调函数,并且这些回调函数将接收一个参数 - 一个表示响应的对象,请参阅API签名和类型信息以获取更多详细信息。“

apiService.getMunicipalityAsync($scope.conf.geoarea).then(
    function(d) { 
     console.debug(d.data, 'return from service'); 
    }, function(error) { 
     alert('error'); 
    }); 

但我认为你有一个错觉。如果你想访问你的控制器增强的数据,那么你必须创造出你需要“解决”,在成功的方法增强型数据的新承诺:

myApp.factory('apiService', function($http, $q) { 
var myService = { 
    getMunicipalityAsync : function() { 
     var deferred = $q.defer(); 

     $http({ 
      method: 'GET', 
      url: 'http://192.168.1.151/temp/angulartest/data/data.json' 
     }).success(function(response) { 
      var result = { 
       'success': true, 
       'data': response.data 
      }; 
      console.debug(result, 'return this'); 
      deferred.resolve(result); 
     }).error(function(data, status, headers, config) { 
      logError("[apiService], getMunicipalityAsync() error, with status: " + status); 
      deferred.reject(); 
     }); 
     return deferred.promise; 
    } 
} 
return myService; 
}); 

那么实际上你可以访问增强数据直接在你的控制器:

apiService.getMunicipalityAsync().then(
    function(enhancedData) { 
     console.debug(enhancedData, 'return from service'); 
    }, function(error) { 
     alert('error'); 
    }); 
+0

根据规格,'then'应该返回一个新的承诺,所以我觉得你可以做类似'$返回HTTP(..)然后(transformOutputFunc);'。 – Alxandr