Rx(JS):如何在flatMap流中更新订阅

时间:2016-01-14 21:03:03

标签: javascript rxjs cyclejs

我有一个状态$ stream来构造消息$ s,这是消息$ stream的数组。状态$已更新,并显示新消息$。

我希望订阅者处理来自所有消息的消息$ in one sinle stream我希望这个流只包含正确的事件。

我每次尝试flatMap合并消息$,但是得到的问题是旧消息$ s(以前的状态$值)多次定时。

我该如何解决这个问题?

let allMessages$ = state$.flatMap(s => { return Observable.merge(s.messages$s) } ) allMessages$.subscribe((x)=>{ console.log('message', x) // message from single message$ appear multiple times })

问题是在更新状态$(推送项目)之后,旧的一个成为多次订阅。 state$ --s(1)---------s(2)---- message$s[0]. --m1----m2-----------m4-- message$s[1] ---------------m3-------- allMessages$ --m1----m2-----m3----m4 m1 m4

s(1) - 当状态有1条消息$时,s(2)当第二条消息$被添加时 因此allMessages $会触发来自item1的消息。

我想要的是: state$ --s(1)---------s(2)----- message$s[0] --m1----m2-----------m4-- message$s[1] ---------------m3-------- allMessages$ --m1----m2-----m3----m4

此fildle显示简化的情况: http://jsfiddle.net/8jFJH/797/

1 个答案:

答案 0 :(得分:2)

根据您的简化情况,这些是订阅序列(您可以查看答案here以了解热门与冷视点的解释,以及对订阅流程的理解):

  • state1的发射
    • 订阅typing$
  • state2的发射
    • 订阅typing$
    • 订阅typing2$

因为您使用flatMap,所以您同时有三个订阅。如果您使用flatMapLatest,则会发生以下情况:

  • state1的发射
    • 订阅typing$
  • state2的发射
    • 'unsubscription'(即使是英语)来自flatMapLatest中发出的上一个流,即Rx.Observable.merge(state.items),即typing$
    • 订阅typing$
    • 订阅typing2$

请尝试将flatMap替换为flatMapLatest,如果能解决问题,请告诉我。

解决这个问题的另一种方法也可以使用状态变化流而不是整个状态(redux的反应类型)。