RX编程:合并两个Observable序列获得指定输出的实现问题
Rx序列按主序列触发取副序列最新值的实现方案
你需要的是只有当o1推送新元素时,才取o2的最新推送值配对生成新元素,这个场景正好匹配Rx中WithLatestFrom操作符的语义,实现代码如下:
// 主序列为o1,每次o1推送新值时取o2的最新值组合 var o3 = o1.WithLatestFrom(o2, (val1, val2) => new { O1Value = val1, O2Value = val2 }); // 如需生成你示例中拼接格式的输出,可将组合逻辑改为 $"{val1}{val2}"
原操作符不生效的原因
Zip:要求两个序列按顺序各推送一个新元素才会生成配对结果,会严格一一对应攒值,不符合o2可推送多个值、仅取o1触发时刻最新值的需求CombineLatest:只要任意一个序列推送新值就会生成配对结果,会产生大量o2触发的多余输出,不符合仅由o1触发输出的要求
兼容旧版本Rx的替代实现
如果使用的Rx版本没有提供WithLatestFrom操作符,可使用如下写法实现相同效果:
var o3 = o2.CombineLatest(o1, (val2, val1) => new { O1Value = val1, O2Value = val2 }) .Sample(o1);
以上实现输出结果和你给出的弹珠图完全匹配:o1推送1时取o2最新的a、推送2时取o2最新的c、推送3时取o2最新的e,完全符合o3的预期输出。
内容的提问来源于stack exchange,提问作者Aaron
相关产品推荐
相关产品推荐

