AngularJS: возврат данных из службы в контроллер

Я пытаюсь создать службу для получения json и передачи ее мне homeCtrl. Я могу получить данные, но когда я передаю их моему homeCtrl, он всегда возвращает undefined. Я застрял.

Мой сервис:

var myService = angular.module("xo").factory("myService", ['$http', function($http){
  return{
    getResponders: (function(response){
      $http.get('myUrl').then(function(response){
         console.log("coming from servicejs", response.data);
      });
    })()
  };
  return myService;
  }
]);

Мой домашний контроллер:

var homeCtrl = angular.module("xo").controller("homeCtrl", ["$rootScope", "$scope", "$http", "myService",
function ($rootScope, $scope, $http, myService) {
 $scope.goData = function(){
     $scope.gotData = myService.getResponders;
 };
 console.log("my service is running", $scope.goData, myService);
}]);

person iceberg    schedule 21.08.2015    source источник


Ответы (2)


Вы должны вернуть обещание из функции getResponders, и когда оно будет разрешено, оно должно вернуть response.data из этой функции.

Фабрика

var myService = angular.module("xo").factory("myService", ['$http', function($http) {
    return {
        getResponders: function() {    
            return $http.get('myUrl')
            .then(function(response) {
                console.log("coming from servicejs", response.data);
                //return data when promise resolved
                //that would help you to continue promise chain.
                return response.data;
            });
        }
    };
}]);

Также внутри вашего контроллера вы должны вызвать фабричную функцию и использовать функцию .then, чтобы вызвать ее, когда функция обслуживания getResponders разрешает вызов $http.get и назначает data на $scope.gotData

Код

 $scope.goData = function(){
     myService.getResponders.then(function(data){
          $scope.gotData = data;
     });

 };
person Pankaj Parkar    schedule 21.08.2015
comment
Что, если бы я хотел, чтобы $scope.goData возвращал данные? Потому что, если я создам другую переменную внутри $scope.goData, а затем сделаю ее равной данным или $scope.gotData, она будет возвращена до того, как получит значение - person Karan Kapoor; 27.12.2015
comment
Не уверен, как работает этот ответ, использовал его, и в контроллер ничего не возвращается - person wsfuller; 12.05.2017
comment
Эй, приятель, спасибо за внимание .. Я исправил свой код сейчас .. пожалуйста, проверьте обновление - person Pankaj Parkar; 12.05.2017

Это пример того, как я сделал для своего проекта, у меня все работает нормально

var biblionum = angular.module('biblioApp', []);//your app
biblionum.service('CategorieService', function($http) {


    this.getAll = function() {

        return $http({
            method: 'GET',
            url: 'ouvrage?action=getcategorie',
            // pass in data as strings
            headers: {'Content-Type': 'application/x-www-form-urlencoded'}  // set the headers so angular passing info as form data (not request payload)
        })
                .then(function(data) {

                    return data;


                })


    }


});

biblionum.controller('libraryController', function($scope,CategorieService) {
  
    var cat = CategorieService.getAll();
    cat.then(function(data) {
        $scope.categories = data.data;//don't forget "this" in the service
    })

  });

person RANDRIAMILASOA Stanislas    schedule 30.08.2015