merge
表示将多个事件流合并处理,用来获取最终所有事件的并集。
merge 的弹珠图-来源 RxJava 反应式编程.png
也就是说,如果想要多个事件同时发送,但又不关心谁先谁后,只想要最后的一个合并结果,就可以用 merge 实现。就像弹珠图描述的那样事件会合并,但当遇到错误异常时就会被终止。
想要即使遇到问题也能继续进行,直到结束后才抛出异常则可以用 mergeDelayError 操作符。
如果仅有两个事件流,可以用 mergeWith 来代替 merge,两者等效。
zip
表示将多个事件流组合起来,同样也是获取合并后的结果,但这更像是逻辑上的合并,而 merge 仅是物理上的组合。所以建议用 merge 时,事件类型最好相同。
zip 的弹珠图-来源 RxJava 反应式编程.png
不过使用 zip 要注意的是,事件流之间最好能有一个固定频率,以确保事件与事件之间同步组合,避免事件之间相互等待,否则随着时间长度的拉大,会有内存泄漏,过期数据等问题存在。
同 mergeWith 类型,zipWith 用于两个事件流的组合。
前面说用 zip 时最好确保事件流之间的同步,如果不同步则可以用以下几种操作符,
combineLatest 当任意一个上游事件产生,就使用另外流的最新已知事件来进行组合。
withLatestFrom 不像 combineLatest,它会区分谁是主事件流,其他就是辅助事件流,只有主事件流有新事件产生,才会组合其他事件。
amb 这个其实都有点偏离组合的本质了,它会从多个事件流中选取最先产生事件的事件流并继续跟踪,其他事件流则直接丢弃。
amb 的弹珠图-来源 RxJava 反应式编程.png
网友评论