Как группировать поступающие задачи в пачки по числу или таймауту?

Асинхронно появляются id, по которым надо запросить информацию из внешнего API.
Запросы можно группировать в пачки до 1000 id в одном.

Появляются эти id волнами – то никого, то сразу много. Но каждый id приходит сам по себе.

Использование вижу примерно так:
import magic from 'откуда?'

magic.addEventListener('execute', (idsArray => callAPI(idsArray)));
// ...
someObject.addEventListener('myEvent', id => magic.add(id));


Надо организовать что-то типа бассейна, в который они будут наливаться, и сливаться на выполнение по достижению одного из двух условий:
  1. набралось больше 1000 – первую тысячу можно отправлять на выполнение;
  2. с момента поступления последнего прошло больше, чем X миллисекунд.


Как грамотно решить сие?
  • пора открыть для себя чудный мир RxJS? – какой оператор поможет?
    Похоже на bufferTime и на просто buffer – но как бы совместить оба?

  • или есть в каком-нибудь lodash волшебный метод? (debounce() это не то)
  • или велосипед пишется в три строки?


Upd. сделал пока такую кривую реализацию:
spoiler

Но тут на setInterval() проверка идёт, явно не так надо, и вообще неоптимально и на коленке. Какие есть промышленные решения?

  • Вопрос задан
  • 64 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы