2016-12-02 66 views
0

我有一个AngularJS函数,它从webservice加载数据,然后将其存储在localStorage中。第一次调用此函数后,应从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

谢谢,那是(几乎)它。 (url).get()。then(...)' 与 'return $ resource(url).get()。$ promise.then(。 ..)' 现在,它的工作。 – Bernie