/* * Fonction qui émule la demande de données depuis le backend. * Le backend a une limitation RPS, et échouera, * si le nombre de requêtes parallèles dépasse MAX_PARALLEL_REQUESTS. */ function requestData(id: number): Promise<string> { parallelRequests++; if (parallelRequests > MAX_PARALLEL_REQUESTS) { throw new Error("Trop de requêtes parallèles"); } return new Promise((res) => { setTimeout(() => { parallelRequests--; return res(`${id * 2}`); }, Math.floor(Math.random() * 2000)) }); } function prepareData( ids: number[], maxParallelRequests: number, ): Promise<string[]> { /* * TODO: implémenter la demande de toutes les données, * en utilisant pas plus de maxParallelRequests * connexions parallèles. */ }
Frontend
Implémentez un hook personnalisé React useSubState, qui prend l'état complet, la fonction setState et le nom de la clé (champ de l'objet), et retourne un tuple du valeur de ce champ et de la fonction pour le modifier — similaire à useState, mais pour un champ spécifique d'un grand objet d'état.
function cloneDeep(something: Cloneable): Cloneable { /* * TODO: implémenter une copie profonde sans JSON.parse/stringify */ return JSON.parse(JSON.stringify(something)); } function assertDeep(a: Cloneable, b: Cloneable) { if (JSON.stringify(a) !== JSON.stringify(b)) { console.error("Pas OK"); } console.log("OK"); } const obj: Cloneable = { a: 1, b: true, c: "bonjour", d: { there: "are", some: ["properties"] }, e: {}, f: [(), (), { key: { value: [1, 2, "3", "four"] } }], g: [] }; assertDeep(obj, cloneDeep(obj));