如何创建在两个可观察对象之间交替的可观察对象

杰森·博伊德(Jason Boyd)

如果我有可观察物ab并且我想根据第三个可观察物在两者之间交替,那c我将如何去做呢?大理石图如下所示:

a: -a1---------a2----a3--a4------a5--a6-----a7----
b: -b1--b2----b3--b4----------------b5---b6---b7--
c: --------c-----------c--------c----------c------
                    alternate
   -a1--------b3--b4-----a4---------b5---b6-a7----
谜团

这很好用:

var query =
    a.Publish(pa =>
        b.Publish(pb =>
            c.StartWith("c")
                .Select((x, n) => n % 2 == 0 ? pa : pb)
                .Switch()));

我使用以下代码进行了测试:

var xs = new []
{
    "a1", "b1", "b2", "c", "b3",
    "a2", "b4", "a3", "c", "a4",
    "c", "a5", "b5", "a6", "b6",
    "c", "a7", "b7",
}
    .ToObservable()
    .Publish();

var a = xs.Where(x => x.StartsWith("a"));
var b = xs.Where(x => x.StartsWith("b"));
var c = xs.Where(x => x.StartsWith("c"));

var query = ...

query.Subscribe(Console.WriteLine);

xs.Connect();

我得到了这个结果:

a1 
b3 
b4 
a4 
b5 
b6 
a7 

xs.Connect()仅仅需要使xs观察的工作作为一种简单的方法来产生三个序列。

甚至作为扩展方法:

public static IObservable<TSource> Alternate<TSource>(
    this IObservable<TSource> leftSelector,
    bool startLeft,
    IObservable<TSource> left,
    IObservable<TSource> right)
{
    return
        left.Publish(pl =>
            right.Publish(pr =>
                leftSelector.StartWith(default(TSource))
                    .Select((x, n) => (n % 2 == (startLeft ? 0 : 1)) ? pl : pr)
                    .Switch()));
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类常见问题

如何“等待” RxJS中的两个可观察对象

来自分类Dev

如何从OnClick Event Android创建可观察对象?

来自分类Dev

如何依次执行两个可观察对象?

来自分类Dev

合并两个可观察对象,其中一个优先级更高

来自分类Dev

如何从pubnub订阅创建可观察对象

来自分类Dev

链接两个带有RxJava的可改进的可观察对象

来自分类Dev

如何从可观察对象数组创建可观察对象数组?

来自分类Dev

创建事件循环的可观察对象

来自分类Dev

如何在Angular2的可观察对象中创建可观察对象

来自分类Dev

如何在Angular 2中“链接”两个单独的可观察对象

来自分类Dev

结合F#中的两个可观察对象

来自分类Dev

合并对象的两个可观察对象还为时过早

来自分类Dev

渲染模板之前,等待两个可观察对象(包括失败的一个)

来自分类Dev

如何将两个可观察项转换为具有两个初始可观察值的映射值的另一个可观察对象?

来自分类Dev

如何使用mergeMap合并两个可观察对象

来自分类Dev

如何在Angular / RxJS中合并两个可观察对象?

来自分类Dev

在两个内部可观察对象之间切换:switchMap不会取消订阅先前的订阅

来自分类Dev

如何创建一个在2个事件之间跳过发射的可观察对象

来自分类Dev

如何取两个可观察数组的差?

来自分类Dev

动态可观察对象

来自分类Dev

如何从所有消息的可观察对象创建未读消息的可观察对象

来自分类Dev

VueJs如何创建具有可观察属性的对象

来自分类Dev

如何在可观察的属性上过滤可观察的对象?

来自分类Dev

两个可观察值的总和

来自分类Dev

合并两个并行的可观察对象

来自分类Dev

如何创建具有间隔的可观察对象

来自分类Dev

如何创建在订阅时激活的多播可观察对象?

来自分类Dev

如何创建单例可观察对象?

来自分类Dev

两个可观察类数组之间的映射

Related 相关文章

  1. 1

    如何“等待” RxJS中的两个可观察对象

  2. 2

    如何从OnClick Event Android创建可观察对象?

  3. 3

    如何依次执行两个可观察对象?

  4. 4

    合并两个可观察对象,其中一个优先级更高

  5. 5

    如何从pubnub订阅创建可观察对象

  6. 6

    链接两个带有RxJava的可改进的可观察对象

  7. 7

    如何从可观察对象数组创建可观察对象数组?

  8. 8

    创建事件循环的可观察对象

  9. 9

    如何在Angular2的可观察对象中创建可观察对象

  10. 10

    如何在Angular 2中“链接”两个单独的可观察对象

  11. 11

    结合F#中的两个可观察对象

  12. 12

    合并对象的两个可观察对象还为时过早

  13. 13

    渲染模板之前,等待两个可观察对象(包括失败的一个)

  14. 14

    如何将两个可观察项转换为具有两个初始可观察值的映射值的另一个可观察对象?

  15. 15

    如何使用mergeMap合并两个可观察对象

  16. 16

    如何在Angular / RxJS中合并两个可观察对象?

  17. 17

    在两个内部可观察对象之间切换:switchMap不会取消订阅先前的订阅

  18. 18

    如何创建一个在2个事件之间跳过发射的可观察对象

  19. 19

    如何取两个可观察数组的差?

  20. 20

    动态可观察对象

  21. 21

    如何从所有消息的可观察对象创建未读消息的可观察对象

  22. 22

    VueJs如何创建具有可观察属性的对象

  23. 23

    如何在可观察的属性上过滤可观察的对象?

  24. 24

    两个可观察值的总和

  25. 25

    合并两个并行的可观察对象

  26. 26

    如何创建具有间隔的可观察对象

  27. 27

    如何创建在订阅时激活的多播可观察对象?

  28. 28

    如何创建单例可观察对象?

  29. 29

    两个可观察类数组之间的映射

热门标签

归档