缓存阵列请求 - 延迟加载

时间:2014-01-31 16:29:11

标签: javascript json node.js

我需要通过网络发送一堆JSON文件。每个文件都很大,我需要按需加载它们。

我的服务器动态提供文件,它也允许数组获取(以最小化http请求)。

这意味着如果我需要Json文件[1, 2, 3, 4, 16, 17, 32],它会向该服务器发出一个ajax请求,并获得所有这些JSON。

现在根据我的理解,缓存是按照请求完成的。这意味着如果我的应用程序再次需要Json文件1,它将发出一个新请求而不是缓存版本,因为它与我的第一个请求不同。

如何解决这个问题?

2 个答案:

答案 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或任何您喜欢的方式实现它。

相关问题