Javascript 如何使用angular factory从rest api返回http get请求?

Javascript 如何使用angular factory从rest api返回http get请求?,javascript,angularjs,Javascript,Angularjs,我试图从工厂内的RESTAPI url返回http get请求。但它不是返回数据,而是返回函数。当我在控制器中使用控制台日志时,它显示了整个功能 MyApp.factory('userFactory', function($http) { var factory = []; factory.users = function(){ $http({ url: '/test/users', method: 'GET'

我试图从工厂内的RESTAPI url返回http get请求。但它不是返回数据,而是返回函数。当我在控制器中使用控制台日志时,它显示了整个功能

MyApp.factory('userFactory', function($http) {

    var factory = [];

    factory.users = function(){
        $http({
            url: '/test/users',
            method: 'GET'
        })
        .then(function successCallback(response) {
            factory.users = response;

        }, function errorCallback(response) {
            factory.users = response;
        });

        return factory.users;
    };

    return factory;

});

我在我的项目中也做同样的事情。请在此处查看回购协议:

httpService是我的http处理程序。然后您可以查看postsService,查看我的getAllPosts函数

基本上就像评论所说的,您必须返回一个承诺并在控制器中处理它

所以你是这样做的:

function getAllPosts() {
        httpService.baseGet(httpUrls.posts)
        .then(function(data) {
            angular.copy(data, posts);
            posts.push({title: 'post test', link: '', upvotes: 3, comments: []});
        }, function(data) {
            httpService.handleError(data);
        });
    }
并让http服务完成以下工作:

angular.module('httpService', [])
.factory('httpService', httpService);

httpService.$inject = ['$http', '$q'];

function httpService($http, $q) {
    var serv = this;
    var methods = {
        httpGet : 'GET',
        httpPost : 'POST',
        httpPut : 'PUT',
        httpDelete : 'DELETE'
    };
    function baseGet(url) {
        return $http.get(url).then(
                function (result) {
                    return result.data;
                },
                function (result) {
                    return $q.reject(result);
                }
                );
    }
    function httpWithParams(url, method, data) {

        return $http({
                url: url,
                method: method,
                params: data,
                dataType: "json",
                headers: {
                    "Content-Type": "application/json"
                }
            }).then(
                function (result) {
                    console.log(result.data);
                    return result.data;
                },
                function (result) {
                    return $q.reject(result);
                }
            );
    }
    function handleError(error) {
            console.log(error);
    }

    return {
        baseGet: baseGet,
        httpWithParams: httpWithParams,
        handleError: handleError,
        methods: methods
    }
}

请参阅$http文档-它返回一个承诺,因此您需要相应地处理它。您的变量命名中似乎也存在一些冲突,这无助于解决问题

我建议遵循数据服务规则。你已经有了大部分

您可以像下面那样在控制器中处理承诺,也可以使用setter(getUser/setUsers-on-factory在控制器/关注点之间共享)


您使用的方法与我使用的略有不同(
$http.get
),但我认为问题在于您需要返回$http承诺。尝试
factory.users=function(){return$http(…
),我们可以从那里开始。您应该返回
response.data
,但不能将函数更改为函数本身内部的对象。。。(即,
factory.users
是一个函数,因此在此函数中,尝试将
factory.users
分配给其他对象是不起作用的)。通过使用上面的代码使其工作。还阅读了一些Johnpaa风格的指南。非常有用的感谢!
  MyApp.factory('userFactory', function($http) {
    // Expose public API first, use func notation
      return { 
          getUsers: getUsers,
      };

      function getUsers(){
          return $http.get('/test/users');
      }
 });

 MyApp.controller('UserController', function(userFactory) {
    // bindables up top
    vm.users = [];

    activate();

    //separate activation logic / promise resolution
    function activate(){
        userFactory.getUsers().then(function(users){
          vm.users = users.data;
        });
    }    
});