複数の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;
});
});
}
答えは非常に簡単です:
このバージョンのrxjsでは、演算子はmergeMap
と呼ばれます
編集:
さらに、import 'rxjs/add/operator/mergeMap'
を使用する必要があります。
私の場合、mergeMapの拡張をインポートする必要がありました。
import 'rxjs/add/operator/mergeMap';
FlatMapはmergeMapのエイリアスなので、上記のモジュールをインポートするとflatMapを使用できるようになります。
RxJS 5.5以降では、flatMap
演算子の名前がmergeMap
に変更されました。代わりに、mergeMap
と共にpipe
演算子を使用する必要があります。
エイリアスFlatMap
を使用して引き続きflatMapを使用できます。
RxJS v5.5.2は、Angular 5のデフォルトの依存バージョンです。
mergeMap
を含むインポートする各RxJSオペレーターについて、「rxjs/operators」からインポートし、パイプオペレーターを使用する必要があります。
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(' '))
);
}
...
}
ここで、flatMap
がmergeMap
に置き換えられ、pipe
演算子が使用されているのと同じように演算子を構成することに注意してください。チェーン。
詳細については、lettable演算子のrxjsドキュメントを参照してくださいhttps://github.com/ReactiveX/rxjs/blob/master/doc/ lettable-operators.md
正しいインポートは次のようになります。
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
クイックアップデート-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
})
);