refresh
🧠 O que é
refresh força a reexecução da função async e atualiza o valor cacheado, ignorando o cache existente.
❓ Por que existe
Quando você precisa de valor absolutamente fresco, não importa se já existe em cache.
✅ Quando usar
- Usuário clica "atualizar" manualmente.
- Detecção de mudança: dados devem ser atualizados agora.
- Sincronização com fonte externa.
- Testes (garantir dados frescos).
🚫 Quando NÃO usar
- Para operação normal: use
fetch(já faz refetch se expirou). - Se pode aceitar dados levemente antigos: use
fetchcomstale: true.
⚡ Exemplo mínimo funcional
const cache = new Cache<string>();
const v1 = await cache.refresh("key", async () => "valor novo");
console.log(v1); // "valor novo"
const v2 = cache.get("key"); // Agora em cache
console.log(v2); // "valor novo"
🧩 Exemplo real de produção
type ExchangeRate = { usd_to_brl: number; timestamp: number };
const ratesCache = new Cache<ExchangeRate>({ defaultTTL: 60_000 });
export async function getExchangeRate(): Promise<ExchangeRate> {
return ratesCache.fetch(
"rates:usd-brl",
async () => {
const res = await fetch("https://api.exchangerate.host/latest?base=USD");
return res.json() as Promise<ExchangeRate>;
}
);
}
// Quando usuário quer taxa fresca
export async function refreshExchangeRate(): Promise<ExchangeRate> {
return ratesCache.refresh(
"rates:usd-brl",
async () => {
console.log("🔄 Atualizando taxa de câmbio...");
const res = await fetch("https://api.exchangerate.host/latest?base=USD");
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return res.json() as Promise<ExchangeRate>;
},
{ ttl: 60_000, tags: ["rates"] }
);
}
⚠️ Erros comuns
1. Usar refresh em loop sem controle
❌ Errado:
setInterval(() => {
cache.refresh("data", loadData); // A cada 1 segundo!
// Se loadData demora 500ms: vai gerar carga excessiva
}, 1_000);
✅ Correto:
setInterval(() => {
cache.refresh("data", loadData);
}, 60_000); // Apenas a cada 1 minuto
2. Não tratar erros de refresh
❌ Errado:
await cache.refresh("data", loadData); // Se loadData falhar?
✅ Correto:
try {
await cache.refresh("data", loadData);
} catch (error) {
console.error("Refresh falhou", error);
}
💡 Boas práticas
- Combine
refreshcomtagspara invalidação:
await cache.refresh("data", fn, {
ttl: 30_000,
tags: ["data", "user:123"],
});
cache.invalidateTag("data"); // Força refresh em breve
- Use em handlers de "reload" do usuário:
export async function handleRefreshButton(userId: string) {
const freshData = await cache.refresh(
`dashboard:${userId}`,
() => loadDashboard(userId)
);
return freshData;
}