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