Skip to content
Advertisement

Select ReplaySubject values emitted untill now

Is there reliable solution to get a snapshot of values currently buffered in ReplaySubject?

I came up with something like this, but not sure how reliable this solution is:

replaySubject.pipe(
    takeUntil(timer(10).pipe(take(1)))
)

The timer factor above seems wrong to me as I have no warranty if all values have been emitted properly within given time (this applies to replay subjects with a lot of values).

Advertisement

Answer

I think this can be an approach:

replay
  .pipe(
    buffer(timer(0)),
    take(1)
  )
  .subscribe(a => {
    console.log(`This is one time value ${a}`);
  });

StackBlitz demo.

The ReplaySubject, when a new subscriber is registered, it will emit its values synchronously:

for (let i = 0; i < copy.length && !subscriber.closed; i += infiniteTimeWindow ? 1 : 2) {
      subscriber.next(copy[i] as T);
    }

for this reason, we’re using buffer(timer(0)): by the time the buffer‘s notifier(timer(0)) emits, the values will have already been added in the buffer‘s array. So, it will be able to emit all the ReplaySubject‘s accumulated values.

User contributions licensed under: CC BY-SA
9 People found this is helpful
Advertisement