web-dev-qa-db-ja.com

RxJS1配列アイテムを単一アイテムのシーケンスに-演算子

そのような観察可能なものを考えると

Rx.Observable.of([1,2,3,4,5])

これは単一のアイテム(つまり配列)を出力します、演算子は何ですかこれはこのオブザーバブルを次のオブザーバブルに変換します5つの単一アイテム(または配列が構成するもの)を放出しますか?

例は.ofにありますが、promiseを介して配列をフェッチする場合も同じであり、他にも多くの例がある可能性があります。 offromに置き換えることを提案しないでください

9
ducin

私はそれを行うための既存のオペレーターを考えることはできませんが、あなたはそれを作ることができます:

arrayEmitting$.concatMap(arrayValues => Rx.Observable.merge(arrayValues.map(Rx.Observable.of)))

またはより単純な

arrayEmitting$.concatMap(Rx.Observable.of)

または最短

arrayEmitting$.concatMap(x => x)

それはテストされていないので、それがあなたのために働いたかどうか、そしてそれがRxjs v4 API(特に最後のもの)を使用しているかどうか私に知らせてください。これは基本的に:

  • 値の各入力配列を1つの単位として処理します(つまり、次の入力配列は前の配列と重複しません。そのため、concatMapを使用します)
  • 着信配列は、マージされるオブザーバブルの配列に変換されます。これにより、値が個別に順番に出力されるようになります。
7
user3743222

FlatMap演算子を使用することもできます( https://stackoverflow.com/a/32241743/3338239 ):

Observable.of([1, 2, 3, 4])
  .flatMap(x => x)
  .subscribe(x => console.log(x));
// output:
// 1
// 2
// 3
// 4
7
Marten S

fromを使用して、配列をシーケンスに変換できるようになりました。

https://www.learnrxjs.io/operators/creation/from.html

from([4,5,6])

2
Joey V.

concatMap(x => x)またはflatMap(x => x)が機能する理由がわかりません。何も変更されません。これは機能するはずです(rxjs 6以降):

of([4,5,6]).pipe(mergeMap(from))
0
dttung1412