Middle+
Implémentez la fonction smartFetch, qui est une enveloppe autour de la fonction batchFetch pour les requêtes de données depuis le backend par ID. La fonction doit accumuler les appels pendant une fenêtre temporelle (timeout) et les envoyer en une seule requête batch. La attente de la prochaine fenêtre commence immédiatement après l'envoi de la requête. Les ID sont uniques, fetch réussit toujours. Il est nécessaire de gérer correctement le cas où, dans une même fenêtre, des ID en double arrivent.
sobes.tech IA
Réponse de l'IA
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 - массив данных в том же порядке, что и 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 { // Si l'id existe déjà, ajouter un autre resolve pour que tous reçoivent la réponse const old = queue.get(id); // Convertir en tableau si nécessaire 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);
}
});
}; }