我需要通过网络发送一堆JSON文件。每个文件都很大,我需要按需加载它们。
我的服务器动态提供文件,它也允许数组获取(以最小化http请求)。
这意味着如果我需要Json文件[1, 2, 3, 4, 16, 17, 32]
,它会向该服务器发出一个ajax请求,并获得所有这些JSON。
现在根据我的理解,缓存是按照请求完成的。这意味着如果我的应用程序再次需要Json文件1
,它将发出一个新请求而不是缓存版本,因为它与我的第一个请求不同。
如何解决这个问题?
答案 0 :(得分:0)
为什么不创建一个处理将请求发送到后端的中央“模块”。在那里,您可以存储一个注册表(或一个简单的数组),它将存储已经获取的文件;这样您就可以决定是否发出请求。
根据我的理解,您发送到后端的数组包含服务器可以找到的一些JSON文件的标识符。如果是这种情况,请将这些ID存储在您的中央模块中,例如dataservice
并在进行任何进一步请求之前进行检查
IF jsonToFetch in jsonCache
THEN
return
ELSE
make the request
ADD jsonToFetch to jsonCache
答案 1 :(得分:0)
在这种情况下,您不能依赖任何内置的缓存机制,因此您必须编写自己的缓存代码。这样的事情可能有用:
var cache = {};
var hasOwnProperty = Object.prototype.hasOwnProperty
function notCached (file) {
return !hasOwnProperty.call(cache, file);
}
function cached (file) {
return cache[file];
}
function getFiles (files, callback) {
var filesToRequest = arr.filter(notCached);
//make real http request
if (filesToRequest.length) {
makeRequest(filesToRequest, _callback);
} else {
process.nextTick(getFromCache);
}
function _callback (err, files) {
if (err) return callback(err);
//cache files
filesToRequest.forEach(function (file, i) {
cache[file] = files[i];
});
getFromCache();
}
function getFromCache () {
callback(null, files.map(getFromCache));
}
}
在这里,您基本上推断出缓存中不存在的文件,并仅请求它们。当然,使用对象作为缓存存储有一些缺点,因此您可以为此创建一些异步接口,并使用fs
或leveldb或任何您喜欢的方式实现它。