Sobes.tech
Middle+

Įgyvendinkite smartFetch funkciją, kuri yra apvalkalas aplink batchFetch funkciją, skirta duomenų užklausoms iš backend pagal ID. Funkcija turi kaupti iškvietimus per laiko langą (timeout) ir siųsti juos vienu partijos užklausa. Sekantis langas pradeda laukti iškart po užklausos siuntimo. ID yra unikalūs, fetch visada sėkmingas. Reikia teisingai apdoroti atvejį, kai vieno lango metu gaunami dubliuojantys ID.

sobes.tech AI

Atsakymas iš 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 - duomenų masyvas toje pačioje tvarkoje kaip ir 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 { // Jei id jau yra, pridėkite dar vieną resolve, kad visi skambučiai gautų atsakymą const old = queue.get(id); // Konvertuoti į masyvą, jei reikia 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);
  }
});

}; }