我已经asked a question关于这个话题,所以这实际上是一个后续行动:
我想创建一个角度服务,当第一次加载应用时,将从服务器获取数据然后我将能够从本地查询数据服务对象。以下是我尝试过的方法:
angular.module('my.services').factory('Properties', function ($http) {
var properties = $http.get("/properties");
return {
get: function (property) {
return properties[property];
}
}
});
问题是 - $http.get()
是异步的,为了实现我想要做的事情,我必须同步使用它。有没有办法用" native" AngularJS?或者我必须使用XHR调用吗?
仅供澄清:此问题与原始问题的区别在于,我不仅希望对property
执行某些操作,例如将其打印到日志中。实际上我想使用property
作为从服务器返回的数据的密钥。如果控制器调用get
时数据还没有 - 我希望它等到数据返回。
这是我现在拥有的非常不优雅的东西:
return {
get: function (property) {
while(!properties.$resolved) {
setTimeout(function() {}, 2000)
}
return properties[property];
}
}
答案 0 :(得分:1)
此:
return properties[property];
不起作用。请记住,properties
是一个承诺。它可能不包含名为property
的属性。你必须像这样使用它:
return {
get: function (property) {
return properties.then(function(response){
return response.data[property];
})
}
}
这将返回一个带有'property'作为内部结果的promise。所以在你的控制器中,像这样使用它:
Properties.get(myProp).then(function(property){
//do something
});
其次,在控制器被调用之前等待承诺解析(我不确定你是否真的需要这个):使用resolve
库的angular ui router
属性。更多信息:https://github.com/angular-ui/ui-router/wiki#resolve
答案 1 :(得分:1)
你可以这样做:
在您的服务中注入$ q,然后:
return {
get: function(property){
var deferred = $q.defer();
$http.get("/properties").then(function(res){
deferred.resolve(res.data[property]);
}).catch(function(err){
//handle error
console.log(err);
deferred.reject(err)
})
return deferred.promise;
}
}
然后在你的控制器中调用它:
Properties.get(prop).then(function(res){
$scope.mydata = res; //or whatever;
}).catch(function(err){
alert(JSON.stringify(err));
})
答案 2 :(得分:0)
angular.module('my.services').factory('Properties', function ($http) {
var properties = $http.get("/properties");
return {
get: function (property) {
properties.then(function(data) {
return data[property];
});
}
}
});
Haven没有对它进行过测试,但我想象的是'属性'是返回数据的关键。