#javascript #caching #browser-cache #cache-control
#javascript #кэширование #браузер-кэш #контроль кэша
Вопрос:
Я создал service worker, который выполняет выборку, а затем немедленно сохраняет данные в кэше.
self.addEventListener('install', async function(e) {
try {
const fileCache = await caches.open(CACHE_NAME);
await fileCache.addAll(FILES_TO_CACHE);
const dataCache = await caches.open(DATA_CACHE_NAME);
const dataFetchResponse = await fetch('/api/transaction');
return await dataCache.put('/api/transaction', dataFetchResponse);
} catch (error) {
console.log(error);
}
});
После выполнения этого я пытаюсь сделать так, чтобы я мог проверить, сколько времени прошло с момента последней выборки данных, чтобы определить, нужно ли обновлять данные. Моя Transaction
модель добавляет временную метку к данным, поэтому в идеале я хотел бы проверить временную метку последней транзакции на текущее время, но я не уверен, как это сделать.
Я пытался это сделать cache.match()
, но он не возвращает весь объект соответствующего ключа. Я знаю, что у localStorage есть .getItem()
метод, но я не вижу никаких похожих методов для cache
этого.
Есть идеи по этому поводу?
Комментарии:
1. Что
cache.match()
возвращает?2. Он вернет совпадающее значение в кэше, но пока примеры, которые я видел, соответствуют только ключу, а не значению.
3. Но это возвращаемое значение не содержит метки времени, которую вы хотите знать?
4. Примеры, которые я видел, будут возвращать только значение ключа, известное как его имя, а не значения, содержащиеся в нем.
5. Не могли бы вы утешить. записать это?
caches.match
поиск во всех кэшах иcache.match()
в определенном catch. Он должен возвращать кэшированное значение, вот как работают работники службы
Ответ №1:
Выяснил, как получить информацию. У вас есть доступ к .match()
key
данным, хранящимся в кэше, и, поскольку он возвращает обещание, вы преобразуете его в .json()
объект.
async function getCachedData(cacheName, url) {
const cacheStorage = await caches.open(cacheName);
const cachedResponse = await cacheStorage.match(url); // Returns a promise w/ matched cache
if(!cachedResponse || !cachedResponse.ok) {return false}
console.log(await cachedResponse);
console.log(await cachedResponse.json()); // prints json object with value of key matched
return await cachedResponse.json();
};