选择到目前为止发出的 ReplaySubject 值

问题描述 投票:0回答:2

是否有可靠的解决方案来获取 ReplaySubject 中当前缓冲的值的快照?

我想出了这样的方法,但不确定这个解决方案有多可靠:

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

上面的计时器因素对我来说似乎是错误的,因为我无法保证所有值是否在给定时间内正确发出(这适用于具有大量值的重放主题)。

javascript rxjs subject replaysubject
2个回答
0
投票

我认为这可以是一种方法:

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

StackBlitz 演示

ReplaySubject
,当新订阅者注册时,它会同步发出其值

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

因此,我们使用

buffer(timer(0))
:当
buffer
的通知器 (
timer(0)
) 发出时,值将已经添加到
buffer
的数组中。因此,它将能够发出所有
ReplaySubject
的累积值。


0
投票

由于

ReplaySubject
同步发出其缓冲值,因此应该足以订阅并立即再次取消订阅。像这样:

const myReplaySubj = new rxjs.ReplaySubject();

myReplaySubj.next( 1 );
myReplaySubj.next( 2 );
myReplaySubj.next( 3 );
setTimeout( () => { // Emit some values "later"
    myReplaySubj.next( 4 );
    myReplaySubj.next( 5 );
}, 0 );

const currentValues = [];
myReplaySubj.subscribe( ( val ) => {
    currentValues.push( val );
} ).unsubscribe();

console.log( currentValues );
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/7.8.1/rxjs.umd.min.js"></script>

© www.soinside.com 2019 - 2024. All rights reserved.