2014-01-31 3 views
0

У меня есть куча файлов JSON, которые мне нужно отправить через провод. Каждый файл довольно большой, и мне нужно загрузить их по требованию.Запросы кэширования массива - ленив Загрузка

Мой сервер обслуживает файлы динамически, и он также позволяет массиву (чтобы минимизировать HTTP-запросы).

Значит, если мне нужен файл Json [1, 2, 3, 4, 16, 17, 32], он делает запрос ajax на сервер с этим массивом, и я получаю все эти JSON.

Теперь из моего понимания кеширование выполняется по запросу. Это означает, что если моему приложению потребуется Json File 1, он будет делать новый запрос вместо кешированной версии, так как это другой запрос из моего первого.

Как решить эту проблему?

+0

Можете ли вы получить данные, сделав запрос на файл вместо одного для всех из них? Это позволит браузеру кэшировать его так, как вы ожидали (до тех пор, пока вы установите соответствующие заголовки). –

ответ

0

Почему бы вам не создать центральный модуль, который будет обрабатывать отправку запросов в конец. Там вы можете сохранить реестр (или простой массив), который сохранит файлы, которые уже были извлечены; Таким образом, вы можете решить, делать запрос или нет.

Из того, что я понял, массив, который вы отправляете в конец, содержит идентификаторы некоторых файлов JSON, которые может найти сервер. Если это так, сохраните эти идентификаторы в своем центральном модуле, например. dataservice и сделать проверку, прежде чем делать какие-либо дальнейшие запросы

IF jsonToFetch in jsonCache 
THEN 
    return 
ELSE 
    make the request 
    ADD jsonToFetch to jsonCache 
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 или любого другого, что вам нравится.

Смежные вопросы