Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在angularjs中从工厂内的$http.get()返回数据_Javascript_Angularjs - Fatal编程技术网

Javascript 如何在angularjs中从工厂内的$http.get()返回数据

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"> {{

我在这方面遇到了很多麻烦,我似乎在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>

{{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;
}