2014-06-16 3 views
0

요청에 따라 서버에서 사람을로드하는 서비스를 만들려고합니다. 첫 번째 버전은 다음과 같이 보았다 :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 
    }; 
}); 

나는 누군가가 내가 여기서 할 노력하고있어 나에게 이것을 달성하는 방법에 대한 좋은 포인터를 줄 수있는 이해를 바랍니다 : 그래서 나는 다른 무언가를 시도했다.

답변

0

전체 예제를 보려면 Plunkr을 확인하십시오.

Restangular는 약속을 반환하고 get 함수는 비동기식 또는 동기식 (자체 캐시를 사용할 경우) 일 수 있으므로 항상 동일한 유형의 객체를 반환하기위한 약속을 만들어야합니다.

Angular documentation for $q service에 설명 된대로 수행 할 수 있습니다. 어떻게 어떤 다른 단지 Restangular.one를 반환하는 것을

PersonService.get(475).then(function (person) { 
    // stuff 
}, function (err) { 
    // err handling 
}); 
+0

('사람': 컨트롤러에서 다음

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

, 당신의 데이터를 검색 :

그래서 get 기능처럼 보일 수 있습니다 , id)? 내가 컨트롤러에서 사용하는 방식은 정확하게 동일하다 :-( – EasterBunnyBugSmasher

+1

당신이 자신의 캐시 시스템을 갖고 싶어하기 때문이다 :) 내 의견으로는 서비스를 만들 필요가 없다. Restangular는 트릭을한다. 당신은 Restangular 캐시 시스템을 사용할 수 있습니다 : https://github.com/mgonto/restangular#can-i-cache-requests) – meriadec

관련 문제