提供Restangular对象的服务

时间:2014-06-16 21:00:20

标签: angularjs restangular

我试图提供一种服务,可以根据需要从服务器加载人员。第一个版本看起来像这样:

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
  };
});

我希望有人理解我在这里尝试做的事情,并且可以给我一个如何实现这一目标的好指针。

1 个答案:

答案 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
});