Middle+
ID боюнча маалымат сурау үчүн batchFetch функциясынын үстүнө smartFetch функциясын ишке ашырыңыз. Функция убакыт терезеси (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 - массив данных в том же порядке, что и 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);
}
});
}; }