Sobes.tech
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);
  }
});

}; }