Подтвердить что ты не робот

Как вернуть данные из $http.get() внутри factory в angularjs

У меня много проблем с этим, и я не могу найти ничего здесь, на SO или Google, что помогает мне определить, что я делаю неправильно

<!DOCTYPE html>
<html data-ng-app="testApp">
   <head>
      <title></title>
   </head>
   <body>
      <div data-ng-controller="myController">
         {{test}}<br/>
         {{test2}}<br/>
         {{test3}}
         <ul>
            <li data-ng-repeat="member in members">{{ member.firstname}}</li>
         </ul>
      </div>
      <script type="text/javascript" src="angular.min.js"></script>
      <script type="text/javascript">
         angular.module('testApp', ['memberFactory']);

         angular.module('testApp',[])
         .factory('memberFactory', function($http){

            var obj = {};
            obj.data = "abcd";
            obj.getResponse = function(){
                var temp = {};
                $http.get('hello.php').success(function(data){
                        alert(data);
                        temp =data;

                });

                return "some return value";
            }

            return obj
         });

         function myController($scope, memberFactory){ 
            $scope.test= "testString";
            $scope.test2= memberFactory.data;
            $scope.test3= memberFactory.getResponse();

         }
      </script>
   </body>
</html>

работает return "some return value";, но когда я пытаюсь вернуть temp, его значение null. Я пробовал различные способы заставить это работать, но я просто не могу установить значение temp внутри функции $http.get()

Это, наверное, что-то простое (или глупая ошибка/ошибочный подход с моей стороны). Любые советы будут очень признательны

4b9b3361

Ответ 1

Используйте defer:

obj.getResponse = function(){                 
    var temp = {};
    var defer = $q.defer();
    $http.get('hello.php').success(function(data){
            alert(data);
            temp =data;
            defer.resolve(data);

    });
    return defer.promise;
}

Ответ 2

То, что происходит здесь, является результатом асинхронного характера $http.get. Когда вы запускаете $http.get, он не запускается в порядке. То есть, он "отходит" и проходит вдоль остальной части кода. Это делается для удовлетворения задержек сервера.

Здесь плохая визуализация.

.getResponse Called                Return Temp.
|-------------------|--------------|
                    |---------------------------------|
                    $http.get ~Waiting for Server~    Temp assigned to data.

Вы можете увидеть, как Temp возвращается до того, как ему присвоено значение?

К счастью, вы можете использовать то, что Angular называет обещанием. Это переменная, которую вы можете вернуть из функции, которая позже будет решена. Вы создаете такое обещание.

var myPromise = $q.defer();

Вы присваиваете ему значения, используя

myPromise.resolve(data);

Затем вы можете вернуть это обещание позже в функции, обычным способом. то есть.

return myPromise.promise

Конечно, для всего этого вам нужна библиотека $q, которую вы включаете в параметры функции.

Ответ 3

//in  $httpProvider.interceptors    
if (typeof response.data === 'string') {
   return response;
}
else {
  return response.data;
}