是否有可靠的解决方案来获取 ReplaySubject 中当前缓冲的值的快照?
我想出了这样的方法,但不确定这个解决方案有多可靠:
replaySubject.pipe(
takeUntil(timer(10).pipe(take(1)))
)
上面的计时器因素对我来说似乎是错误的,因为我无法保证所有值是否在给定时间内正确发出(这适用于具有大量值的重放主题)。
我认为这可以是一种方法:
replay
.pipe(
buffer(timer(0)),
take(1)
)
.subscribe(a => {
console.log(`This is one time value ${a}`);
});
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
的累积值。
由于
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>