我有一个状态$ 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/
答案 0 :(得分:2)
根据您的简化情况,这些是订阅序列(您可以查看答案here以了解热门与冷视点的解释,以及对订阅流程的理解):
state1
的发射
typing$
state2
的发射
typing$
typing2$
因为您使用flatMap
,所以您同时有三个订阅。如果您使用flatMapLatest
,则会发生以下情况:
state1
的发射
typing$
state2
的发射
flatMapLatest
中发出的上一个流,即Rx.Observable.merge(state.items)
,即typing$
typing$
typing2$
请尝试将flatMap
替换为flatMapLatest
,如果能解决问题,请告诉我。
解决这个问题的另一种方法也可以使用状态变化流而不是整个状态(redux的反应类型)。