Sobes.tech

Frontend

/* * Funcție care imită solicitarea datelor din backend. * Backend-ul are o limitare RPS și va eșua, * dacă numărul de solicitări paralele depășește MAX_PARALLEL_REQUESTS. */ function requestData(id: number): Promise<string> { parallelRequests++; if (parallelRequests > MAX_PARALLEL_REQUESTS) { throw new Error("Prea multe solicitări paralele"); } return new Promise((res) => { setTimeout(() => { parallelRequests--; return res(`${id * 2}`); }, Math.floor(Math.random() * 2000)) }); } function prepareData( ids: number[], maxParallelRequests: number, ): Promise<string[]> { /* * TODO: implementați solicitarea tuturor datelor, * folosind nu mai mult de maxParallelRequests * conexiuni paralele. */ }

125

Implementați un hook personalizat React useSubState, care primește starea completă, funcția setState și numele cheii (câmpul obiectului) și returnează un tuple din valoarea acestui câmp și funcția pentru modificarea sa — similar cu useState, dar pentru un câmp specific al unui obiect mare de stare.

116

function cloneDeep(something: Cloneable): Cloneable { /* * TODO: implementați clonarea profundă fără JSON.parse/stringify */ return JSON.parse(JSON.stringify(something)); } function assertDeep(a: Cloneable, b: Cloneable) { if (JSON.stringify(a) !== JSON.stringify(b)) { console.error("Nu este OK"); } console.log("OK"); } const obj: Cloneable = { a: 1, b: true, c: "salut", d: { there: "are", some: ["properties"] }, e: {}, f: [(), (), { key: { value: [1, 2, "3", "four"] } }], g: [] }; assertDeep(obj, cloneDeep(obj));

107