AngularJS:加载缓存或未缓存的网址

时间:2016-12-02 08:16:01

标签: javascript angularjs

我有一个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)看起来怎么样?

谢谢, 哈德

1 个答案:

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