从可观察状态重播主题(发出以前的所有事件)

时间:2018-12-30 13:49:00

标签: rxjs observable

我有一个可观察的对象,我正在尝试以此作为重放对象。它应该发出可观察到的当前事件和所有以前的事件。

根据此answer,这是我认为可行的方法:

// create an observable from dummy array and a blank replay subject
const observable$ = from([1, 2, 3])
const replay$ = new ReplaySubject()

// create a replay subject from the observable (not working as expected)
observable$.subscribe(replay$)

// log out the events
observable$.subscribe(e => console.log('observable', e) )
replay$.subscribe(e => console.log('replay', e))

日志

observable 1
observable 2
observable 3
replay 1
replay 2
replay 3

我正在寻找的行为使得重放主题也发出先前的事件,就像这样:

replay [1]
replay [1, 2]
replay [1, 2, 3]

如何归档?

1 个答案:

答案 0 :(得分:1)

ReplaySubject仅在订阅时重播整个序列。这意味着仅当您呼叫replay$.subscribe()时。之后,它只会通过所有排放。

您想要从输出中获得的结果看起来像是要与scan()链接在一起,因为ReplaySubject会逐个发射项目,而不是您期望的累积数组。

observable$.pipe(
  scan((acc, val) => [...acc, val], []),
).subscribe(replay$);

实时演示:https://stackblitz.com/edit/rxjs-yfgkvf?file=index.ts