/* * Συνάρτηση που μιμείται την αίτηση δεδομένων από το backend. * Το backend έχει περιορισμό RPS και θα αποτύχει, * αν ο αριθμός των παράλληλων αιτημάτων υπερβαίνει το MAX_PARALLEL_REQUESTS. */ function requestData(id: number): Promise<string> { parallelRequests++; if (parallelRequests > MAX_PARALLEL_REQUESTS) { throw new Error("Πάρα πολλά παράλληλα αιτήματα"); } return new Promise((res) => { setTimeout(() => { parallelRequests--; return res(`${id * 2}`); }, Math.floor(Math.random() * 2000)) }); } function prepareData( ids: number[], maxParallelRequests: number, ): Promise<string[]> { /* * TODO: υλοποιήστε την αίτηση όλων των δεδομένων, * χρησιμοποιώντας όχι περισσότερες από maxParallelRequests * παράλληλες συνδέσεις. */ }
Frontend
Υλοποιήστε ένα προσαρμοσμένο hook του React useSubState, το οποίο λαμβάνει το πλήρες state, τη συνάρτηση setState και το όνομα του κλειδιού (πεδίο του αντικειμένου), και επιστρέφει ένα tuple με την τιμή αυτού του πεδίου και τη συνάρτηση για την τροποποίησή του — παρόμοιο με το useState, αλλά για ένα συγκεκριμένο πεδίο ενός μεγάλου αντικειμένου κατάστασης.
function cloneDeep(something: Cloneable): Cloneable { /* * TODO: υλοποιήστε βαθύ κλωνοποίηση χωρίς JSON.parse/stringify */ return JSON.parse(JSON.stringify(something)); } function assertDeep(a: Cloneable, b: Cloneable) { if (JSON.stringify(a) !== JSON.stringify(b)) { console.error("Όχι εντάξει"); } console.log("Εντάξει"); } const obj: Cloneable = { a: 1, b: true, c: "γεια", d: { there: "are", some: ["properties"] }, e: {}, f: [(), (), { key: { value: [1, 2, "3", "four"] } }], g: [] }; assertDeep(obj, cloneDeep(obj));