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

<Meta title='@dxtmisha/vi/functional-basic/Classes/Cache - Bộ nhớ đệm cơ bản'/>

# Lớp Cache

> **⚠️ Đã lỗi thời** — Lớp này đã lỗi thời và không nên được sử dụng.

Một cơ chế lưu trữ đệm trong bộ nhớ (memory-based) nhẹ nhàng. Nó cung cấp một cách hiệu quả để thực thi các hàm truy xuất dữ liệu tốn kém chỉ khi cần thiết, dựa trên "mảng so sánh" (comparison arrays) để kích hoạt việc hủy bỏ và tính toán lại bộ nhớ đệm.

## Các tính năng chính

- **Đánh giá theo yêu cầu** — các hàm chỉ được thực thi khi giá trị được lưu trong bộ nhớ đệm bị thiếu hoặc bị hủy bỏ.
- **Hủy bỏ theo mảng so sánh** — tự động tính toán lại bộ nhớ đệm nếu mảng phụ thuộc được cung cấp thay đổi (tương tự như mảng phụ thuộc của `useMemo` hoặc `useEffect` trong React).
- **Hỗ trợ không đồng bộ** — hoạt động liền mạch với việc truy xuất dữ liệu dựa trên `Promise`.

## Khởi tạo

Để khởi tạo đối tượng, hãy gọi hàm khởi tạo `Cache()`.

```typescript
import { Cache } from '@dxtmisha/functional'

// 1. Khởi tạo bộ lưu trữ
const cache = new Cache()

// 2. Lấy hoặc tính toán giá trị
const user = cache.get('user', () => 'Admin', [1])
```

## Các phương thức

### Hành động

#### `get`

Sử dụng phương thức `get()` để truy xuất một giá trị được lưu trong bộ nhớ đệm hoặc tính toán nó nếu nó không tồn tại hoặc đã cũ.

**Tham số:**
- `name: string` — một mã định danh duy nhất cho mục nhập bộ nhớ đệm.
- `callback: () => T` — hàm tính toán giá trị.
- `comparison?: any[]` — mảng phụ thuộc tùy chọn. Nếu bất kỳ giá trị nào trong mảng này thay đổi so với lần gọi cuối cùng, bộ nhớ đệm sẽ bị hủy và `callback` sẽ chạy lại.

**Trả về:** `T` — giá trị đã lưu đệm hoặc giá trị mới được tính toán.

```javascript
let counter = 0

// Sẽ đánh giá và lưu trữ "User 1"
const user1 = cache.get('user', () => `User ${++counter}`, [1])

// KHÔNG đánh giá lại, trả về "User 1" đã lưu đệm
const unchanged = cache.get('user', () => `User ${++counter}`, [1])

// Mảng phụ thuộc thay đổi từ [1] thành [2]
// Sẽ đánh giá lại và lưu trữ "User 2"
const changed = cache.get('user', () => `User ${++counter}`, [2])
```

#### `getAsync`

Hoạt động tương tự như `get()`, nhưng được thiết kế cho các cuộc gọi không đồng bộ.

**Tham số:**
- `name: string` — một mã định danh duy nhất cho mục nhập bộ nhớ đệm.
- `callback: () => Promise<T>` — hàm không đồng bộ tính toán giá trị.
- `comparison?: any[]` — mảng phụ thuộc tùy chọn.

**Trả về:** `Promise<T>` — giá trị không đồng bộ đã lưu đệm hoặc giá trị mới được tính toán.

```javascript
async function fetchUser(id) {
  return cache.getAsync('user_api', async () => {
    const res = await fetch(`/api/users/${id}`)
    return res.json()
  }, [id])
}

// Cuộc gọi đầu tiên truy cập mạng
const u1 = await fetchUser(5)

// Cuộc gọi thứ hai trả về dữ liệu đã lưu đệm ngay lập tức (không truy cập mạng)
const u1Cached = await fetchUser(5)

// Phụ thuộc `id` thay đổi (5 !== 6), truy cập mạng một lần nữa
const u2 = await fetchUser(6)
```
