我正在构建一个网页,它在表格中显示数据库中的数据。我想使用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并保存数据以便以后重用?
答案 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逻辑与手头的逻辑分开。