13

我在这方面遇到了很多麻烦,我似乎在 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 时,它为空。我已经尝试了各种方法来让它工作,但我似乎无法在$http.get()函数内设置临时值

这可能很简单(或者对我来说是一个愚蠢的错误/误导的方法)。任何建议将不胜感激

4

3 回答 3

24

使用延迟:

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;
}
于 2013-08-07T11:14:20.910 回答
14

这里发生的事情是 $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);

然后,您可以稍后在函数中以正常方式返回此承诺。IE。

return myPromise.promise

当然,对于所有这些,您需要包含在函数参数中的 $q 库。

于 2013-08-07T11:22:12.900 回答
0
//in  $httpProvider.interceptors    
if (typeof response.data === 'string') {
   return response;
}
else {
  return response.data;
}
于 2017-03-30T03:32:25.160 回答