Как вернуть данные из $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()
Это, наверное, что-то простое (или глупая ошибка/ошибочный подход с моей стороны). Любые советы будут очень признательны
Ответы
Ответ 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;
}