angularjs показывает, чтобы получить данные из файла json внутри сервиса

#jquery #json #angularjs #asynchronous

#jquery #json #angularjs #асинхронный

Вопрос:

У меня есть файл json

 [
    {
        "Name": "namesfoo3",
        "param1": "paramoffoo3",
        "param2": "param2offoo3"
    },
    {
        "Name": "namesfoo3",
        "param1": "paramoffoo3",
        "param2": "param2offoo3"
    }
]
  

И я хочу получить данные через сервис и передать их в качестве контроллера.
js-файл:

 var myApp = angular.module('myApp',[]);

myApp.controller('filtrController',function($http,$scope,testService)
{                      
     Init();
     function Init()
     {
           $scope.data={};
           console.log(testService.getData());    
     }

});

myApp.service('testService',function($http)
{    
     this.getData = function()
     {
         var obj = {content:null};
         $http.get('data.json')
              .success(function(response) {
              // alert();
              console.log(response);
              obj.content = response;
         });
              return obj;      
     }
});
  

Но в консоли входа в контроллер у меня есть return: Object {content: null} .
Данные загружаются правильно, потому что в сервисе я получаю правильный объект и данные. Итак, как я могу передать данные контроллеру?
Также этот пример все еще работает, когда я возвращаю данные из массива php, а затем передаю их как json_encode?

Ответ №1:

Вы не можете выполнить возврат внутри обратного вызова, он асинхронный, и в то время, когда приходит ответ от сервера, функция уже завершена, и вы потеряете поток.

Вместо этого вам нужно использовать обещания. Итак, из службы вы возвращаете обещание контроллеру, и когда приходит ответ, в контроллере будет запущен обратный вызов. Вот так:

 var myApp = angular.module('myApp', []);

myApp.controller('filtrController', function ($scope, testService) {

    Init();

    function Init() {
        $scope.data = {};
        testService.getData().then(data) {
            console.log(data)
        });
    }

});

myApp.service('testService', function ($http) {

    this.getData = function () {
        return $http.get('data.json');
    }
});
  

Вы также можете связать обещания, на случай, если вы хотите что-то сделать с данными в сервисе. Подробнее об этом в документах о сервисе $ q.

Комментарии:

1. Это лучший ответ здесь, поскольку $ http уже возвращает обещание, нет необходимости в $ q для такой простой задачи

Ответ №2:

Вы выполняете асинхронный вызов, поэтому вам следует дождаться обратного вызова.

Измените свой код на:

 function Init()
{
    $scope.data={};
    testService.getData().then(function(result){
          console.log(result);
    })                  
}
  

Теперь в сервисе вам также нужно подождать, чтобы вернуть объект. В противном случае вы возвращаете obj до того, как он будет извлечен:

 myApp.service('testService',function($http)
{    
     this.getData = function()
     {
         var defer = $.Deferred();
         $http.get('data.json')
              .success(function(response) {
                  // alert();
                  console.log(response);
                  defer.resolve(response);

              })
              .error(function(error){
                  console.error("The async call has fail");
              });
              return defer.promise();      
     }
});
  

Ответ №3:

 myApp.service('testService',function($http)
{    
     this.getData = function()
     {
         **return** $http.get('data.json')
              .success(function(response) {
              // alert();
              console.log(response);
              obj.content = response;
         });

     }
});