Rx JS: как выдавать значения определенного размера буфера с задержкой между каждой группой - PullRequest
1 голос
/ 09 июля 2020

У меня есть большое наблюдаемое значение, где я хочу разбить его на фиксированные размеры, а затем выдавать каждый фрагмент с задержкой до завершения.

Чтобы быть немного более конкретным, мой сценарий - это то, где я могу иметь много данных для отправки на сервер через HTTP-запрос, где для каждого значения нужен отдельный HTTP-запрос. Поэтому, если у меня есть 1000 ожидающих бит данных, я не хочу выполнять 1000 HTTP-запросов сразу, я могу сказать «сделать 10», а затем задержать на короткое время (возможно, на пару секунд).

Я предполагаю, что здесь должен использоваться оператор buffer, но не могу заставить его делать то, что я хочу. Я просмотрел много примеров, но так и не нашел тот, который делает именно это.

Вот простой пример, я пытался (но не правильно) ...

    import { interval,of , range} from 'rxjs';
    import { buffer, bufferTime, delay, throttleTime, bufferCount, take } from 'rxjs/operators';

    const source = range(1,1000);
    const example = source.pipe(bufferCount(10), delay(5000));
    const subscribe = example.subscribe(val =>
        console.log('output:', val)
    );

Также доступно здесь, на stackblitz

Глядя на вывод, мы можем увидеть, делит ли их на блоки по 10, но затем он просто ждет 5000 мс и выводит их все.

Я бы хотел, чтобы первые 10 запускались сразу, а затем каждое последующее задерживалось, в данном случае на 5 секунд.

У кого-нибудь есть какие-нибудь указания, как это сделать?

Заранее спасибо.

1 Ответ

2 голосов
/ 09 июля 2020

Вы можете попробовать следующее:

 const source = range(1, 1000);

 const example = source
   .pipe(
     bufferCount(10),
     concatMap(x => of(x).pipe(delay(5000))),
    );
   
 const subscribe = example.subscribe(val =>
   console.log('output:', val)
 );
...