Angularjs 提供重新启动的对象的服务
我正在尝试创建一个服务,该服务将根据需要从服务器加载人员。第一个版本如下所示:Angularjs 提供重新启动的对象的服务,angularjs,restangular,Angularjs,Restangular,我正在尝试创建一个服务,该服务将根据需要从服务器加载人员。第一个版本如下所示: services.factory('PersonServiceOld', function(Restangular, ErrorService) { var persons = []; var requesting = []; var get = function(id) { if (requesting[id]) { return persons[id];
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返回的对象不是重新启动的对象。所以我尝试了别的方法:
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
};
});
我希望有人能理解我在这里要做的事情,并能给我一个很好的指示,告诉我如何做到这一点。查看这个完整的例子
由于Restangular返回承诺,并且在使用自己的缓存时,get函数可能是异步的或同步的,因此需要创建一个承诺,以便始终返回相同类型的对象
您可以按照中的说明进行操作
因此,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
});
这和返回餐厅有什么不同吗?一个人,身份证?我在控制器中使用它的方式完全相同:-这是因为您希望拥有自己的缓存系统!:在我看来,在您的情况下不需要创建服务,Restangular就可以做到这一点,您可以使用Restangular缓存系统: