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缓存系统: