Sobes.tech
Middle+

Implemente la función smartFetch, que es un envoltorio alrededor de la función batchFetch para solicitudes de datos desde el backend por ID. La función debe acumular llamadas durante una ventana de tiempo (timeout) y enviarlas en una sola solicitud por lotes. La espera para la siguiente ventana comienza inmediatamente después de enviar la solicitud. Los ID son únicos, fetch siempre tiene éxito. Es necesario manejar correctamente el caso en que en una misma ventana lleguen ID duplicados.

sobes.tech AI

Respuesta de la 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 { // Если 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);
  }
});

}; }