AngularJS $ http.post里面的函数

时间:2014-11-19 10:13:31

标签: javascript angularjs service

我正在使用AngularJS,在服务中我有这个:

var fn = {
    test: function() {
        $http.post(...)
        .success(function(response) {
            console.log(response);
            return response;
        })
    }
}

this.testPostCall = function (id) {
   console.log(fn.test());
};

在控制器testPostCall未定义,实际上在控制台中,我得到的第一个输出是未定义的,第二个输出是正确的JSON响应。

你知道为什么在控制器内部未定义? 谢谢

2 个答案:

答案 0 :(得分:2)

这是因为你正在做 asynchronous procedure not a synchronous one 。如 $http documentation

中所示
  

$ http API基于 $q 公开的延迟/承诺API   服务

您的代码实际上显示的是正确的行为,这是因为fn.test()函数没有返回任何内容,因此评估为undefined。如果要访问从测试函数收到的数据,则必须返回$http.post()本身。

它应该是这样的:

var fn = {
    test: function() {
        return $http.post(...);
    }
};

fn.test().success(function(data) {
  console.log(data);
});

EXAMPLE

答案 1 :(得分:1)

你的过程完全错了。试试这种方式

服务

var myModule = angular.module('myModule', []);
myModule.factory('serviceId', function () {
    var shinyNewServiceInstance = {
        test: test
    };
    // factory function body that constructs shinyNewServiceInstance
    return shinyNewServiceInstance;

    function test() {
        $http.post(...)
            .success(function (response) {
                console.log(response);
                return response;
            })
    }
});

<强>控制器

myModule.controller('TestController', ['$scope', 'serviceId',
    function ($scope, serviceId) {
        $scope.greeting = 'Hola!';
        $scope.Test = Test;

        function Test() {

            console.log(serviceId.test());
        }
    }
]);