Middle+
Implementeer de functie smartFetch, die een wrapper is rond de functie batchFetch voor dataverzoeken vanaf de backend op basis van ID. De functie moet oproepen gedurende een tijdsvenster (timeout) verzamelen en deze in één batch-verzoek verzenden. Het wachten op het volgende venster begint onmiddellijk na het verzenden van het verzoek. ID's zijn uniek, fetch is altijd succesvol. Het is noodzakelijk om correct om te gaan met het geval waarin binnen één venster dubbele ID's binnenkomen.
sobes.tech AI
Antwoord van 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 van gegevens in dezelfde volgorde als 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 { // Als id al bestaat, voeg nog een resolve toe zodat alle oproepen het antwoord krijgen const old = queue.get(id); // Omzetten naar array indien nodig 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);
}
});
}; }