我试图提供一种服务,可以根据需要从服务器加载人员。第一个版本看起来像这样:
services.factory('PersonServiceOld', function(Restangular, ErrorService) {
var persons = [];
var requesting = [];
var get = function(id) {
if (requesting[id]) {
return persons[id];
}
requesting[id] = true;
persons[id] = {'id' : id, 'photoName' : '0.png'};
Restangular.one('persons', id).get().then(function(success) {
persons[id].firstName = success.firstName;
persons[id].lastName = success.lastName;
persons[id].photoName = success.photoName;
}, function(failure) {
requesting[id] = false;
ErrorService.serverError(failure);
});
return persons[id];
};
var reset = function() {
persons = [];
requesting = [];
};
return {
getPerson : get,
clearCache : reset,
};
});
这样我就可以立即获得一个对象的引用,稍后会稍微填充数据。它运作良好......直到我注意到在另一个用例中,我还想要求一个人的地址
var person = PersonService.get(id);
person.one(address).get().then(.......
但是从PersonService返回的对象不是Restangular对象。所以我尝试了别的东西:
services.factory('PersonService', function(Restangular, ErrorService) {
var persons = [];
var get = function(id) {
if (!persons[id]) {
persons[id] = Restangular.one('persons', id);
persons[id].get().then(function(success) {
}, function(failure) {
ErrorService.serverError(failure);
persons[id] = null;
});
}
return persons[id]; // also tried: persons[id].$object
};
return {
getPerson : get
};
});
我希望有人理解我在这里尝试做的事情,并且可以给我一个如何实现这一目标的好指针。
答案 0 :(得分:0)
检查此 Plunkr 以获取完整示例。
由于Restangular返回promises,并且您的get
函数可能是异步的或同步的(如果您使用自己的缓存),您需要创建一个承诺,以便始终返回相同类型的对象。
您可以按照Angular documentation for $q service。
中的说明进行操作因此,您的get
功能可能如下所示:
var get = function (id) {
var deferred = $q.defer();
if (store[id]) {
deferred.resolve(store[id]);
} else {
Restangular.one('person', id).get().then(function (res) {
store[res.id] = res;
deferred.resolve(res);
}, function (err) {
deferred.reject(err);
});
}
return deferred.promise;
}
然后在您的控制器中,检索您的数据:
PersonService.get(475).then(function (person) {
// stuff
}, function (err) {
// err handling
});