How to make a delay after every 5 calls in rxjs?

Viewed 135

I have an endless stream of events and I need to limit them to 5, keep the rest paused for 3 seconds

So need to make a delay after every 5 calls

2 Answers
    from([ 1,2,3,4,5,6,7,8,9,11,12,13,14,15,16,17,18,19,21,22,23,24,25,26,27,28 ])
      .pipe(
        // To demonstrate 1 after 1 values stream we use concatMap
        // we return new Observalbe via of operator
        // we pipe the delay for each element based on the index value we passed 
        // in our concatMap
        concatMap((x,i) => of(x).pipe(
          delayWhen((x) => { 
            console.log("im index: " + i);
            // Not the first element, and every 5th element
            return i !== 0 && i % 5 === 0 ? timer(3000): timer(0)})
          ))
      )
      .subscribe(x => console.log(x))
      // Output: 1,2,3,4,5 ...delay 3s.... 6,7,8,9,10 ...delay 3s...

You can see in this stackblitz I made.

const stream = range(0, 100) // create dataset
  .pipe(
    bufferCount(5), // slice data into chunks
    concatMap( // get this chunk 
      (msg) => of(msg).pipe(
        delay(3000) // and emit every three seconds
      ))
  )
stream.subscribe(item => console.log(item));
Related