2016-12-02 1 views
0

Webservice의 데이터를로드 한 다음 localStorage에 저장하는 AngularJS 함수가 있습니다. 이 함수를 처음 호출 한 후에는 데이터가 localStorage에서로드되어야합니다 (캐시가 한 시간 후에 유효하지 않은 경우 제외).AngularJS : 캐싱되거나 캐싱되지 않은 URL로드

이 기능을 외부화하고 싶습니다만, 동기와 비동기 호출을 한 가지 방법으로 처리하는 방법을 고민하고 있습니다. 여기에 우리가 간다.

function callWebService(url) { 
    var resultFromLocalStorage = localStorage.getItem(url); 
    if (resultFromLocalStorage && Utils.cacheIsStillValid()) { //(*) 
     $timeout(function() { buildTable(JSON.parse(resultFromLocalStorage)); }, 10); 
    } else { 
     $resource(url).get().$promise.then(function(result) { 
      localStorage.setItem("cacheExpiry", new Date().getTime() + Utils.ONE_HOUR_IN_MS); 
      localStorage.setItem(url, JSON.stringify(result)); 
      buildTable(result); 
     }); 
    } 
} 
//*Utils.cacheIsStillValid checks the localStorage item "cacheExpiry" 

결국, 난 그냥이 원하는, 그래서 내가 그 캐싱 물건을 구체화하고 싶습니다 :

function callWebService(url) { 
    var result = getResultFromCacheOrReload(url); // to be done 
    buildTable(result); 
} 

내가 어떻게 할 수 있습니까? 방법 getResultFromCacheOrReload(url)는 어떻게 보입니까? 문제가 해결 될 때

감사합니다, 베른

+0

당신이해야 프로에 캐싱을 남겨주세요. etags를 설정하여 브라우저에 캐시하도록 지시하십시오. –

+0

답변 해 주셔서 감사합니다. 불행히도 나는 우리 서버에 etags를 설정할 수 없습니다. – Bernie

답변

1

단순히 getResultFromCacheOrReload에서 promise를 반환하고 테이블을 만들 :

function callWebService(url) { 
    var result = getResultFromCacheOrReload(url).then(function (result) { 
     buildTable(result); 
    }); 
} 

getResultFromCacheOrReload 될 수있는 기능 뭔가 같은 :

function getResultFromCacheOrReload(url) { 
    var resultFromLocalStorage = localStorage.getItem(url); 
    if (resultFromLocalStorage && Utils.cacheIsStillValid()) { 
     return $q.when(resultFromLocalStorage); // Create a fulfilled promise containing resultFromLocalStorage 
    } else { 
     return $resource(url).get().then(function (result) { // Return the promise returned by the "then" method 
      localStorage.setItem("cacheExpiry", new Date().getTime() + Utils.ONE_HOUR_IN_MS); 
      localStorage.setItem(url, JSON.stringify(result)); 
      return result; // Every object returned by a then() method is wrapped by a promise 
     }); 
    } 
} 
+0

고마워, 그게 (거의). 방금 ​​다음 줄을 수정해야했습니다 :'return $ resource (url) .get(). then (...)' with 'return $ resource (url) .get(). $ promise.then (. ..)' 이제 작동합니다. – Bernie