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

调试数据不一样:( 看

谢谢!

4

1 回答 1

3

成功和错误这两种方法是 $http 的特定方法,如以下文档中所述: http: //docs.angularjs.org/api/ng .$http

这些方法成功和错误获取 4 个参数:数据、状态、标头和配置。但是普通的 promise 方法只会得到一个对象。在您的代码中,您实际上可以看到您在 getMunicipalityAsync 的 then 函数中获得的参数“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');
    });
于 2013-06-25T11:30:00.113 回答