今天我有一个我真不理解的问题:)
我写了一个调用我的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');
});
调试数据不一样:(
谢谢!
答案 0 :(得分:3)
两种方法成功与错误是$ http的具体方法,如以下文档中所述: http://docs.angularjs.org/api/ng。$ HTTP
这些方法成功与错误得到4个参数:数据,状态,标题和配置。但正常的promise方法只能得到一个对象。 在您的代码中,您实际上可以看到参数" d"你进入getMunicipalityAsync的then函数包含属性data,status,headers和config。 这在文档中也明确提到:
"由于调用$ http函数的返回值是一个promise,你也可以使用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');
});