import {Meta} from '@storybook/addon-docs/blocks'

<Meta title='@dxtmisha/ru/functional-basic/Classes/CacheItem - Продвинутое Управление Кэшем'/>

# Класс CacheItem

> **⚠️ Устарел** — Этот класс устарел и не рекомендуется к использованию.

Внутренний механизм, управляющий отдельными записями кэша. В то время как `Cache` и `CacheStatic` предоставляют публичные интерфейсы для работы с глобальным кэшем приложения, именно класс `CacheItem` отвечает за жизненный цикл, хранение и правила инвалидации каждого конкретного значения.

> `CacheItem` является **вспомогательным классом**, предназначенным для внутреннего управления отдельными записями кэша. В большинстве случаев рекомендуется взаимодействовать с кэшированием через классы `Cache` или `CacheStatic`.

## Ключевые особенности

- **Отслеживание зависимостей** — поддерживает массивы сравнения для определения актуальности закэшированного значения.
- **Ленивые вычисления** — гарантирует, что ресурсоемкая функция (callback) запускается только при изменении зависимостей.
- **Историческая память** — сохраняет ссылку на предыдущее значение (`getCacheOld`) даже после обновления кэша.
- **Асинхронная поддержка** — нативная работа как с синхронными (`getCache`), так и с асинхронными (`getCacheAsync`) данными.
- **Строгая инвалидация** — использует логику глубокого сравнения для минимизации лишних вычислений.

## Инициализация

Как вспомогательный компонент, `CacheItem` обычно создается менеджерами более высокого уровня. Тем не менее, его можно инициализировать вручную, если требуется кастомная, изолированная логика кэширования.

### Ограничения дженериков (Generic Constraints)

Для обеспечения строгой типизации закэшированного значения класс поддерживает следующий дженерик:
- `T` — Тип данных, хранящихся в кэше.

**Параметры:**
- `callback: () => T` — функция, которая генерирует или загружает данные для кэша.

```typescript
import { CacheItem } from '@dxtmisha/functional-basic'

// 1. Инициализация с функцией получения данных
const userCache = new CacheItem(() => fetchUserData())

// 2. Использование дженериков для строгой типизации
const numberCache = new CacheItem<number>(() => Math.random())
```

## Методы

### Доступ к кэшу

- `getCache(comparison?: any[]): T` — Извлекает значение из кэша. Если массив зависимостей `comparison` изменился, запускает пересчет.
- `getCacheAsync(comparison?: any[]): Promise<T>` — Асинхронная версия `getCache`. Возвращает Promise, который разрешается в закэшированные или новые данные.

### История

- `getCacheOld(): T | undefined` — Возвращает значение, которое хранилось в кэше непосредственно до последнего обновления.

## Примеры

### Инвалидация на основе зависимостей
```javascript
let count = 0
const counterCache = new CacheItem(() => ++count)

// Первый вызов: вычисляет и кэширует 1
counterCache.getCache([10]) // возвращает 1

// Второй вызов: зависимости [10] не изменились, возвращает закэшированную 1
counterCache.getCache([10]) // возвращает 1

// Третий вызов: зависимости изменились на [20], вычисляет и кэширует 2
counterCache.getCache([20]) // возвращает 2

// Проверка истории:
console.log(counterCache.getCacheOld()) // возвращает 1
```

### Кэширование данных API
```javascript
const apiCache = new CacheItem(async () => {
  const response = await fetch('/api/data')
  return response.json()
})

// Загружает данные из сети при первом запросе с ключом 'v1'
const data1 = await apiCache.getCacheAsync(['v1'])

// Возвращает данные мгновенно из кэша для последующих запросов 'v1'
const data2 = await apiCache.getCacheAsync(['v1'])
```
