RxPy - 为什么排放与合并运算符交错?

时间:2016-10-24 02:06:31

标签: python rx-java reactive-programming rx-py

所以我在做RxJava和RxKotlin两年后学习RxPy。我注意到的一件事是,某些运算符导致RxJava中不会发生的疯狂交错。

例如,flat_map()会导致排放量与简单Observable来源无序交错。

items = Observable.from_( ("Alpha","Beta","Gamma","Delta","Epsilon"))

items.flat_map(lambda s: Observable.from_(list(s))).subscribe(print)

输出:

A
l
B
p
e
G
h
t
a
D
a
a
m
e
E
m
l
p
a
t
s
a
i
l
o
n

然而,使用RxJava或RxKotlin,一切都按顺序排列。

fun main(args: Array<String>) {
    Observable.just("Alpha","Beta","Gamma","Delta","Epsilon")
        .flatMap {
            Observable.from(it.toCharArray().asIterable())
        }.subscribe(::println)
}

输出:

A
l
p
h
a
B
e
t
a
G
a
m
m
a
D
e
l
t
a
E
p
s
i
l
o
n

我确认一切都在MainThread上运行,并且没有奇怪的异步调度(我认为)。

为什么RxPy会这样做?我注意到这种情况几乎发生在处理多个Observable源合并在一起的运算符上。默认的Scheduler究竟在做什么?

另外,为什么RxPy中没有concat_map()?我得到的印象是,这对于调度的工作原理是不可能的......

1 个答案:

答案 0 :(得分:3)

正如已经指出的那样,flatMap不保证订单。 RxPy不会将concat_map实现为不同的运算符,但您可以使用mapconcat_all运算符获得相同的效果

Observable.from_( ("Alpha","Beta","Gamma","Delta","Epsilon"))\
          .map(lambda s: Observable.from_(list(s)))\
          .concat_all()\
          .subscribe(print)