2016-10-24 3 views
1

私は2年間RxJavaとRxKotlinをやった後にRxPyを学んでいます。私が気づいていることの1つは、特定の演算子がRxJavaで発生しない狂ったインターリーブを引き起こすことです。RxPy - 合併事業者が排出をインターリーブするのはなぜですか?

たとえば、flat_map()は、単純なObservableソースの場合、排出物がインターリーブされなくなります。

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

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

OUTPUT:

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) 
} 

OUTPUT:

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はこのように動作しますか?私は、複数のソースが一緒にマージされることを扱っているオペレータであれば、これがほとんど起こることに気づきます。デフォルトのスケジューラは何をしていますか?

また、RxPyにはconcat_map()がないのはなぜですか?私はスケジューリングの仕方によっては何とかできないという印象を受けています...

+2

を使用して同じ効果を得ることができますそれに頼っている。注文を保存する必要がある場合は、 'concatMap'を使用してください。 –

+0

さて、確かにそうだね。私はなぜ 'concat_map()'がRxPyに実装されていないのかという私の質問を進化させるでしょうか?これを含めるように質問が更新されます... – tmn

答えて

3

すでに言及したように、flatMapは注文を保証しません。 RxPyは明確なオペレーターとしてconcat_mapを実装していないが、あなたは、 `flatMap`がRxJava順序を尊重するために起こるという事実は、実装の詳細であり、あなたはいけないmapconcat_allオペレーター

Observable.from_(("Alpha","Beta","Gamma","Delta","Epsilon"))\ 
      .map(lambda s: Observable.from_(list(s)))\ 
      .concat_all()\ 
      .subscribe(print) 
関連する問題