【发布时间】:2016-01-14 21:03:03
【问题描述】:
我有一个包含 messages$s 的 state$ 流,它是 messages$ 流的数组。 State$ 被更新并且新消息$ 出现。
我希望订阅者在一个单一流中处理来自所有消息$ 的消息,并且我希望这个流仅包含正确的事件。
我每次都尝试对合并的消息$进行平面映射,但遇到的问题是旧消息$s(在以前的 states$ 值中)被多次订阅。
我该如何解决这个问题?
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$ 更新(推送项目)后,旧的会被多次订阅。
state$ --s(1)---------s(2)----
message$s[0]. --m1----m2-----------m4--
message$s[1] ---------------m3--------
allMessages$ --m1----m2-----m3----m4
m1 m4
s(1) - 当 state 有 1 个 message$ 时,s(2) 当第二个 message$ 添加时 所以 allMessages$ 会触发来自 item1 的消息。
我想要的是:
state$ --s(1)---------s(2)-----
message$s[0] --m1----m2-----------m4--
message$s[1] ---------------m3--------
allMessages$ --m1----m2-----m3----m4
这个文件显示了简化的情况: http://jsfiddle.net/8jFJH/797/
【问题讨论】:
-
很难理解你在说什么。最好是给出一个输入、预期输出和实际输出的例子,并解释差异(就好像你基本上会为你的函数编写一个测试一样)。我最好的选择是您必须使用
flatMapLatest而不是flatMap,但如果不了解您的功能规范就很难说。 -
好的,尝试绘制。问题是生成的 sream 从相同的流中接收多个事件。
-
实际上我设法做到了这一点,添加
distinct()不确定它是否正确,因为我是 RxJs 的新手。 -
这是否意味着您的问题解决了?
-
我想确认它是正确的解决方案,或者再找一个。
标签: javascript rxjs cyclejs