Middle+
Υλοποιήστε τη λειτουργία smartFetch, η οποία είναι ένα περιτύλιγμα πάνω από τη λειτουργία batchFetch για αιτήματα δεδομένων από το backend με βάση το ID. Η λειτουργία πρέπει να συγκεντρώνει τις κλήσεις κατά τη διάρκεια ενός χρονικού παραθύρου (timeout) και να τις στέλνει σε ένα ενιαίο αίτημα παρτίδας. Η αναμονή για το επόμενο παράθυρο ξεκινά αμέσως μετά την αποστολή του αιτήματος. Τα ID είναι μοναδικά, το fetch είναι πάντα επιτυχές. Είναι απαραίτητο να χειριστεί σωστά την περίπτωση που μέσα σε ένα παράθυρο έρχονται διπλότυχα ID.
sobes.tech AI
Απάντηση από AI
javascript function smartFetch(batchFetch, timeout) { let queue = new Map(); // id -> [resolve, reject] let timer = null;
function flush() { const ids = Array.from(queue.keys()); const resolvers = Array.from(queue.values()); queue = new Map(); timer = null;
batchFetch(ids).then(results => {
// results - array of data in the same order as ids
results.forEach((result, index) => {
resolvers[index].resolve(result);
});
});
}
return function(id) { return new Promise((resolve, reject) => { if (!queue.has(id)) { queue.set(id, {resolve, reject}); } else { // Αν το id υπάρχει ήδη, προσθέστε ένα άλλο resolve ώστε όλες οι κλήσεις να λάβουν την απάντηση const old = queue.get(id); // Μετατροπή σε πίνακα αν χρειάζεται if (Array.isArray(old)) { old.push({resolve, reject}); queue.set(id, old); } else { queue.set(id, [old, {resolve, reject}]); } }
if (!timer) {
timer = setTimeout(flush, timeout);
}
});
}; }