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更加一致,以避免奇怪的争用条件错误(例如,缓存承诺并每次返回)。