代码之家  ›  专栏  ›  技术社区  ›  Hoff

重放可观察到的主题(发出所有以前的事件)

  •  1
  • Hoff  · 技术社区  · 7 年前

    我有一个可观察的,我正试图从中重播主题。它应该发射电流和可观测到的所有以前的事件。

    这是我认为会起作用的,根据这个 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 回复  |  直到 7 年前
        1
  •  1
  •   martin    7 年前

    ReplaySubject 仅在订阅时重播整个序列。这意味着只有当你打电话的时候 replay$.subscribe() . 之后,它只通过所有的排放。

    从你想要得到的输出中,它看起来像是你想要用链子连接起来的。 scan() 因为 重播主题 一个接一个地发出项目,而不是像您期望的那样累积数组。

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

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