Javascript 如何在angularjs中从工厂内的$http.get()返回数据
我在这方面遇到了很多麻烦,我似乎在SO或Google上找不到任何帮助我发现我做错了什么的东西Javascript 如何在angularjs中从工厂内的$http.get()返回数据,javascript,angularjs,Javascript,Angularjs,我在这方面遇到了很多麻烦,我似乎在SO或Google上找不到任何帮助我发现我做错了什么的东西 <!DOCTYPE html> <html data-ng-app="testApp"> <head> <title></title> </head> <body> <div data-ng-controller="myController"> {{
<!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>
{{test}}
{{test2}}
{{test3}}
- {{member.firstname}
angular.module('testApp',['memberFactory']);
角度模块('testApp',[])
.factory('memberFactory',函数($http){
var obj={};
obj.data=“abcd”;
obj.getResponse=函数(){
var temp={};
$http.get('hello.php').success(函数(数据){
警报(数据);
温度=数据;
});
返回“某个返回值”;
}
返回obj
});
函数myController($scope,memberFactory){
$scope.test=“testString”;
$scope.test2=memberFactory.data;
$scope.test3=memberFactory.getResponse();
}
返回“某个返回值”代码>可以工作,但当我尝试返回temp时,它为null。我尝试了各种方法来实现这一点,但似乎无法在$http.get()
函数中设置临时值
这可能是一些简单的事情(或者是我愚蠢的错误/误导的做法)。如有任何建议,将不胜感激请使用延迟:
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;
}
这里发生的事情是$http.get异步特性的结果,当您运行$http.get时,它不会按顺序运行。也就是说,它“分支”并沿着代码的其余部分运行。这样做是为了适应服务器延迟
这是一个糟糕的想象
.getResponse Called Return Temp.
|-------------------|--------------|
|---------------------------------|
$http.get ~Waiting for Server~ Temp assigned to data.
在给定值之前,您能看到Temp是如何返回的吗
谢天谢地,您可以使用Angular所称的promise,这是一个可以从函数返回的变量,稍后会得到“解析”。你可以像这样实例化一个承诺
var myPromise = $q.defer();
您可以通过使用为其赋值
myPromise.resolve(data);
然后,您可以稍后在函数中以正常方式返回此承诺。即
return myPromise.promise
当然,所有这些都需要$q库,它包含在函数参数中。什么是$q?我没有被定义。这是另一个库吗?它必须以与$http
相同的方式注入。这是promise/defer模式的AngularJS实现。@CodeZilla ok,但现在它返回{“promise”:{}}
而不是什么,所以我仍然无法访问我的数据,有什么想法吗?是的。尝试按照@Matt Cooper的建议返回承诺。重复使用$q$http返回一个承诺对象obj.getResponse=function(){var temp={};返回$http.get('hello.php')。成功(函数(数据){alert(数据);temp=data;});}哎呀,在我发布之前没有看到Codezilla的答案,他们的想法是对的。不过,我将把这个作为一个解释。谢谢你的解释,不幸的是,我现在刚刚得到{“承诺”:{}
非常抱歉!刚刚注意到我的代码中有一个bug。您需要返回myPromise.promise(如中所示,实际的promise对象!),这样就可以工作了。对不起,把你引入歧途了!我的意思是我仍然得到空值,我得到的是我认为应该得到的{promise:{}{code>{code>{promise:[{ID:“1”,“firstname:“John”,“姓氏”:“Smith”},{ID:“2”,“firstname:“Jack”,“姓氏”:“Jones”}
我设法得到了,我只需要调用我的承诺。$apply()
谢谢您使用的是angular 1.0.1,这将在1.3中出现。请您解释一下您在回答中到底在做什么。这将有助于理解。简单地编写代码并不能提供清晰性。
//in $httpProvider.interceptors
if (typeof response.data === 'string') {
return response;
}
else {
return response.data;
}