web-dev-qa-db-ja.com

rxjsフラットマップがありません

複数のrx.jsオブザーバブルをチェーンして、データを渡そうとしています。 Flatmapは近似演算子である必要がありますが、

import { Observable } from 'rxjs/Observable';

見つかりません:

Error TS2339: Property 'flatmap' does not exist on type 'Observable<Coordinates>'

Rx.jsのバージョン5.0.0-beta.6が使用されます。

public getCurrentLocationAddress():Observable<String> {
    return Observable.fromPromise(Geolocation.getCurrentPosition())
      .map(location => location.coords)
      .flatmap(coordinates => {
        console.log(coordinates);
        return this.http.request(this.geoCodingServer + "/json?latlng=" + coordinates.latitude + "," + coordinates.longitude)
          .map((res: Response) => {
                       let data = res.json();
                       return data.results[0].formatted_address;
              });
      });
  }
56
Georg Heiler

答えは非常に簡単です:

このバージョンのrxjsでは、演算子はmergeMapと呼ばれます

編集:

さらに、import 'rxjs/add/operator/mergeMap'を使用する必要があります。

104
Georg Heiler

私の場合、mergeMapの拡張をインポートする必要がありました。

import 'rxjs/add/operator/mergeMap';

FlatMapはmergeMapのエイリアスなので、上記のモジュールをインポートするとflatMapを使用できるようになります。

67
Chris Peacock

RxJS 5.5以降では、flatMap演算子の名前がmergeMapに変更されました。代わりに、mergeMapと共にpipe演算子を使用する必要があります。

エイリアスFlatMapを使用して引き続きflatMapを使用できます。

RxJS v5.5.2は、Angular 5のデフォルトの依存バージョンです。

mergeMapを含むインポートする各RxJSオペレーターについて、「rxjs/operators」からインポートし、パイプオペレーターを使用する必要があります。

Http要求ObservableでmergeMapを使用する例

import { Observable } from 'rxjs/Observable';
import { catchError } from 'rxjs/operators';
...

export class ExampleClass {
  constructor(private http: HttpClient) {
    this.http.get('/api/words').pipe(
      mergeMap(Word => Observable.of(Word.join(' '))
    );
  }
  ...
}

ここで、flatMapmergeMapに置き換えられ、pipe演算子が使用されているのと同じように演算子を構成することに注意してください。チェーン。


詳細については、lettable演算子のrxjsドキュメントを参照してくださいhttps://github.com/ReactiveX/rxjs/blob/master/doc/ lettable-operators.md

17
Trent

正しいインポートは次のようになります。

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/mergeMap';

モジュールmergeMapをインポートすると、コードでflatMapを使用できるようになります

コードimport { Observable } from 'rxjs/Rx';をインポートする場合、追加のmergeMapインポートは必要ありませんが、AoTコンパイル中にエラーが発生する可能性があります。

ERROR in ./node_modules/rxjs/_esm5/observable/BoundCallbackObservable.js
Module build failed: TypeError: Cannot read property 'type' of undefined
6
rafalkasa

クイックアップデート-2019年5月

rxjs v6.5.1の使用

mergeMap演算子としてインポート、例えば/

import { Observable, from, of } from "rxjs";
import { map, filter, mergeMap } from "rxjs/operators";

次に、新しいpipe機能と組み合わせて使用​​します。例:

var requestStream = of("https://api.github.com/users");
var responseStream = requestStream.pipe(
  mergeMap(requestUrl => {
    console.log(requestUrl);
    ... // other logic
    return rp(options);  // returns promise
  })
);
2
arcseldon