You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

60 lines
2.0 KiB

\begin{figure}
\begin{subfigure}[t]{\textwidth}
\begin{lstlisting}[style=JavaScript]
function useCategoryCache() {
const [cache, setCache] = React.useState<Record<string, Category>>({});
// useCallback permet de retourner la même référence à la fonction
// si sa closure reste inchangée. Contrairement à d'autres librairies,
// React requiet qu'on passe manuellement les références présentes
// dans la closure de `getCategory`, ici `cache`
// (`fetchCategory` se trouve en dehors du hook)
const getCategory = React.useCallback(async (id) => {
if (cache[id]) return cache[id];
return fetchCategory(id).then((movie) => {
setCache((cache) => ({
...cache,
[id]: movie
}));
return movie;
});
}, [cache]);
return getCategory;
}
const Page = (props) => {
const categories = props.categories;
const [fullCategories, setFullCategories] = React.useState();
const getCategory = useCategoryCache();
// useEffect éxecute le callback dès qu'une des références (aka "dépendance")
// de la liste change; ici, comme appeler `getCategory` a une chance de changer
// la référence à cette fonction, le useEffect est appelé plusieures fois
React.useEffect(() => {
const promises = categories.map((category) => getCategory(category));
Promise.all(promises).then((fullCategories) => {
setFullCategories(fullCategories);
});
}, [getCategory, categories]);
// ...
};
\end{lstlisting}
\caption{Code susceptible à un bug causant les requêtes à être envoyées plusieures fois}
\end{subfigure}
\begin{subfigure}[t]{0.45\textwidth}
\includegraphics[width=\textwidth]{fromeffectloop}
\caption{Les flèches correspondent à un appel, les points à une dépendance}
\end{subfigure}
\hfill
\begin{subfigure}[t]{0.45\textwidth}
\includegraphics[width=0.3\textwidth]{fromeffectloop2}
\caption{TODO}
\end{subfigure}
\caption{Version simplifiée du bug causant plusieures requêtes à être executées}
\label{fromeffectloop}
\end{figure}