Javascript 设置REST属性的AngularJS服务无法正确设置

Javascript 设置REST属性的AngularJS服务无法正确设置,javascript,rest,angularjs,Javascript,Rest,Angularjs,考虑到以下角度: var app = angular.module('testing',[]); app.service('auth',function($http) { var user = ''; $http.get("http://localhost/auth/user").success(function(data) { user = data.user; console.log("User: " + u

考虑到以下角度:

var app = angular.module('testing',[]);
app.service('auth',function($http)  
{  
    var user = '';  
    $http.get("http://localhost/auth/user").success(function(data)  
    {  
        user = data.user;    
        console.log("User: " + user); //prints Woot4Moo
    });
    return{  
         getUser: function(){    
              return user;  
         }  
     };
});
JSON响应:

{"user":"Woot4Moo"}
控制器中的用法:

app.controller('controller',function($http,auth)  
{  
          $http({  
                url:"http://localhost/my/rest/call/",  
                method: "GET",  
                params: {person: auth.getUser()}   //this comes back empty
          }).success(function(data){...}  
};  
因此,要重申我如何将我的最终url设置为:

http://localhost/my/rest/call/?user='Woot4Moo'
而不是像这样:

http://localhost/my/rest/call/?user=     <- the empty string

http://localhost/my/rest/call/?user=     我认为如果你只是想改变终端url

$location.url("my/rest/call/?user='"+user+"'");
应该有用


希望这对您在
auth
中进行异步HTTP调用有所帮助

当应用程序首次启动时,控制器立即从您的服务请求
user
的值,并获取设置的空字符串。只有在调用稍后触发的成功回调时,才为
user
设置值

您可以这样做:

app.service('auth',function($http)  
{  
    var user; 
    function queryUser() {
      return $http.get("http://localhost/auth/user").then(function(data)  
      {  
          user = data.data.user;
          return user;
      });
    }

    function getUser() {
      return user ? user : queryUser();
    }

    return{  
         getUser: getUser
     };
});
确保在用户的初始请求中调用了
queryUser
,然后将值缓存到
user
中后,所有后续调用都将返回缓存的值

如果需要,在服务内部调用函数
getUser()
,以在初始化时设置值

我还将研究更改控制器中的逻辑。像这样立即依赖异步调用可能不是一个好主意


示例

当这在Angular的视图系统中工作时,重要的是要认识到,
getUser
将返回字符串或承诺,这取决于数据是否缓存——在许多情况下,可能需要或谨慎地使公共API更加一致,以避免奇怪的争用条件错误(例如,缓存承诺并每次返回)。