Sobes.tech
Назад к вопросам
Middle+
3

Реализуйте функцию smartFetch, которая является оберткой над функцией batchFetch для запросов данных с бэкенда по ID. Функция должна накапливать вызовы в течение временного окна (timeout) и отправлять их одним батч-запросом. Ожидание следующего окна начинается сразу после отправки запроса. ID уникальны, fetch всегда успешен. Необходимо корректно обрабатывать случай, когда в рамках одного окна приходят дублирующиеся ID.

Компании, где спрашивали
А7-Технологии

Ответ от нейросети

sobes.tech 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 - массив данных в том же порядке, что и 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);
  }
});

}; }


**Объяснение:**
- smartFetch возвращает функцию, которая принимает id и возвращает Promise с результатом.
- Внутри накапливаем уникальные id в Map, где ключ — id, а значение — объект с resolve/reject или массив таких объектов, если id дублируется.
- По таймауту вызываем batchFetch с накопленными id.
- После получения результатов вызываем все соответствующие resolve для каждого id.
- Таймер запускается заново после каждого отправленного батча.