Javascript缓存http获取结果

时间:2015-11-21 23:18:44

标签: javascript asynchronous promise

我正在构建一个网页,它在表格中显示数据库中的数据。我想使用HTTP GET来获取数据,但我希望将其缓存(我正在讨论客户端Javascript),所以我不必发送更多请求它

我尝试过承诺:

var get = function(aUrl) {
    return new Promise(function(resolve, reject) {
        var anHttpRequest = new XMLHttpRequest();
        anHttpRequest.onreadystatechange = function() { 
            if (anHttpRequest.readyState == 4 && anHttpRequest.status == 200)
                resolve(anHttpRequest.responseText);
        }

        anHttpRequest.open( "GET", aUrl, true );            
        anHttpRequest.send( null );
    })
}  

this.getTableData = function() {
    get("http://localhost:3000/test")
    .then(function(result) {
        console.log(result);
    })
}

我认为我可以存储承诺的结果,但我找不到这样做的方法,这可能是不可能的。

所以,让我把它包起来:我如何只使用一次HTTP GET并保存数据以便以后重用?

2 个答案:

答案 0 :(得分:2)

像这样的东西

var get = (function() {
    var promises = {};
    return function(aUrl, forceReload) {
        if (!promises[aUrl] || forceReload) {
            promises[aUrl] = new Promise(function(resolve, reject) {
                // your code is unchanged in here
            });
        }
        return promises[aUrl];
    }
}());

这将返回一个新的Promise,或者之前为同一个url创建的一个...添加了一个forceReload参数,因为当我使用这样的函数时,逻辑存在合理的原因< / p>

我建议你在适当的时候拒绝承诺,否则你只会有一个永久未决的承诺,但你应该能够最终确定有错误或非200响应 - 所以在这种情况下拒绝承诺。但这只是对理智代码的推荐

答案 1 :(得分:0)

在promisified函数之外创建一个变量来存储结果。

获得结果后,将结果存储在此变量中。

如果填充了上述变量,请在promisified函数中添加一个短路以立即解决承诺。

或者(并且可能优选地),将memoize函数应用于promisified函数,从而将memoization逻辑与手头的逻辑分开。