Как вернуть http get запрос из rest api с угловой фабрикой?

0

Я пытаюсь вернуть HTTP-запрос от остального api url внутри фабрики. Но это не возвращает данные, а вместо функции. Когда я использую консольный журнал внутри контроллера, он показывает всю функцию.

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;

});
  • 0
    Вы используете метод немного иной, чем я ( $http.get ), но я думаю, что проблема заключается в том, что вам нужно вернуть обещание $ http. Попробуйте factory.users = function() { return $http(... и мы можем перейти оттуда.
  • 1
    вы должны возвращать response.data , но вы не можете преобразовать функцию в объект внутри самой функции ... (т.е. factory.users - это функция, и поэтому внутри этой функции пытаются назначить factory.users другому объект не будет работать).
Теги:

2 ответа

1
Лучший ответ

Я делаю то же самое в своих проектах. Ознакомьтесь с репо здесь: https://github.com/ahmadabdul3/mean-flapperNews/tree/master/public/Index/angular

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
    }
}
  • 0
    Потребовалось некоторое время, но получил работу с вашим кодом большое спасибо!
  • 0
    без проблем, мой друг :)
1

См. $ Http docs - он возвращает обещание, поэтому вам нужно обработать его соответствующим образом. У вас также есть некоторые конфликты в названии переменных, которые не помогут решить эту проблему.

Я предлагаю следовать руководству по угловому стилю johnpapa - и в этом случае правилу данных. У вас больше всего этого.

Вы можете либо выполнить обещание в контроллере, как показано ниже, либо использовать сеттер (getUser/setUsers на заводе для обмена между контроллерами/проблемами).

  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;
        });
    }    
});
  • 0
    Получил работу с помощью кода сверху. Также прочитал некоторые из руководства по стилю johnpapa. Очень полезное спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню