【发布时间】:2016-07-08 15:50:19
【问题描述】:
我正在寻找一些关于如何识别哪个流进入merge 或combineLatest 函数的最佳实践建议,以便只对新流进行操作。
在 TODO 应用程序的上下文中,我有传入的添加和删除流,我想将它们组合起来,以便我的列表编辑可以在单个流中以无状态的方式进行。输出是一个集成了 add(concat) 和 remove(filter) 事件的列表,否则您似乎最终会得到包含所有 add 或 remove 事件的其他流,从而无限增长。
遇到的问题包括:
- 使用
merge并不表示传入的是哪个流; - 使用
combineLatest并不表示是哪个流触发了订阅的流,因此您不能只执行与该流相关的操作。 - 使用
withLatestFrom会生成一个不会更新withLatestFrom输入源的新列表,因此除非也对此列表感兴趣的下一个流订阅该列表,否则该列表将不同步(或者您拥有每个新列表基于之前的列表,这会导致不必要地重新执行之前发生的所有转换...)。
目前发现的似乎不太理想的方法包括:
- Cycle JS TODO 应用程序明确地将
type属性直接分配给早期流的创建对象以进行识别,我认为应该避免使用直接识别流来自哪里的 RxJS 方法? - 接受http://www.jisaacks.com/manipulating-rxjs-streams/ 的建议,并将添加流和删除流的输出拆分为
[null, {addItem}]和[removeItem, {null}],这样当将merge用于添加和删除事件时,我仍然可以识别传入流正在更新,以便我可以在单个流中执行添加和删除(但随后我想添加切换事件等,但这似乎也不正确,因为我需要创建知道的流输出所有其他潜在流(以 [null, null, myOutput, null, null 等结束)。
非常欢迎任何最佳实践建议。
【问题讨论】:
标签: javascript stream rxjs rxjs5 frp