我有一个AngularJS函数,它从Web服务加载数据,然后将其存储在localStorage中。在第一次调用此函数后,应该从localStorage加载数据(除非缓存在一小时后无效)。
我想将此函数外部化,但我正在摸不着头脑,如何将同步和异步调用放入一个方法中。我们走了。
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 :(得分:1)
只需从promise
返回getResultFromCacheOrReload
并在解析后构建表格:
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
});
}
}