http.get()获取反序列化的JSON但返回HTTP响应?

时间:2014-08-06 14:59:46

标签: json angularjs angularjs-service angular-promise

在我的Angular应用程序中,我有一个baseController.js类和一个类exampleController.js,它可以通过将自己的范围注入baseController来访问baseController中定义的函数。这允许所有控制器之间的共享功能。

这是有效的,除了我尝试从getDataFromUrl()调用exampleController函数的情况。在调试时,我可以看到getDataFromUrl()被调用,并且它进入.success()调用的$http.get()函数。那时我可以看到data是一个反序列化的JSON对象(在这种情况下,它是一个对象数组)但是当代码最终回到exampleController的{​​{1}}函数时它最终收到的initArray()不再是反序列化的对象,而是变成了原始的HTTP响应数据。

baseController.js:

data

exampleController.js:

// Data retrieval function for all derived controllers
$scope.getDataFromUrl = function (url) {
    return $http.get(url)
    .success(function (data) {
        return data;
    })
    .error(function () {
        return null;
    });
};

为什么appModule.controller('exampleController', [ '$scope', '$controller', '$http', '$window', '$location', '$timeout', function ($scope, $controller, $http, $window, $location, $timeout) { var base = $controller('baseController', { $scope: $scope }); // Initiate an array of data var initArray = function (data) { $scope.sortedArray = sortDataByDate(data); }; // Calling function in scope defined by base controller class $scope.getDataFromUrl('resources/data').then(function (data) { initArray(data); }); }]); 作为HTTP响应返回data?我想让它保持反序列化的JSON!

2 个答案:

答案 0 :(得分:1)

successerror回调不属于您的getDataFromUrl()功能。此外,您不能像异步调用那样将数据返回给调用者。相反,该函数应该返回对$http调用的承诺,然后从调用者处理成功。这是一种方法。

$scope.getDataFromUrl = function (url) {
  // return a promise to the async action and handle `success` and `error` in the caller
  return $http.get(url);
};

// for example
$scope.getDataFromUrl('resources/data').then(function (data) {
  initArray(data);
});
// or
$scope.getDataFromUrl('resources/data').success(function (data) {
  initArray(data);
}).error(function() {
  alert('Server error');
});

答案 1 :(得分:0)

想出来,我得到原始响应数据,因为.then() .success()不会因// Data retrieval function for all derived controllers $scope.getDataFromUrl = function (url, successFunction) { $http.get(url) .success(function (data) { successFunction(data); }) .error(function () { return null; // Or whatever you want to return }); }; 而触发,因此到达子控制器的数据从未反序列化。这是正确的代码:

<强> baseController.js:

appModule.controller('exampleController', [
        '$scope', '$controller', '$http', '$window', '$location', '$timeout',
        function ($scope, $controller, $http, $window, $location, $timeout) {
            var base = $controller('baseController', { $scope: $scope });

            // Initiate an array of data
            var initArray = function (data) {
                $scope.sortedArray = sortDataByDate(data);
            };

            // Calling function in scope defined by base controller class
            $scope.getDataFromUrl('resources/data', function (data) {
                initArray(data);
            });
}]);

<强> exampleController.js:

{{1}}