---
{
title: "Explaining React's cache Function",
description: "",
published: '2023-12-17T21:52:59.284Z',
authors: ['crutchcorn'],
tags: ['react', 'webdev', 'javascript'],
attached: [],
license: 'cc-by-4'
}
---
> Some warning about how this is an experimental API and may change in the future
1) Compare/contrast React useMemo/useCallback/memo/cache
2) Show how `cache` persists between functions
```jsx
import { createRoot } from "react-dom/client";
import { cache, useReducer, useState } from "react";
const test = cache((id) => {
alert(id);
});
function App() {
const [counter, setCounter] = useState(0);
const [_, rerender] = useReducer(() => ({}), {});
test(counter);
return (
);
}
createRoot(document.getElementById("root")).render();
```
Mention this as useful when combined with React's `use` Hook
It even caches results:
```jsx
const getIsEvenOrOdd = cache(
(number) =>
new Promise((resolve) => {
setTimeout(() => {
resolve(number % 2 === 0 ? "Even" : "Odd");
}, 2000);
}),
);
function App() {
const [counter, setCounter] = useState(0);
const isEvenOrOdd = getIsEvenOrOdd(counter);
return (
{counter} is {isEvenOrOdd}
);
}
```
And errors:
```jsx
const getIsEven = cache((number) => {
alert("I am checking if " + number + " is even or not");
if (number % 2 === 0) {
throw "Number is even";
}
});
// Even if you render this component multiple times, it will only perform the
// calculation needed to throw the error once.
function ThrowAnErrorIfEven({ number, instance }) {
getIsEven(number);
return