webentwicklung-frage-antwort-db.com.de

rxjs flatmap fehlt

Ich versuche, mehrere rx.js Observables zu verketten und die Daten weiterzugeben. Flatmap sollte der Anpassungsoperator sein, aber mit einem Import von

import { Observable } from 'rxjs/Observable';

es wird nicht gefunden:

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

Ausführung 5.0.0-beta.6 von rx.js wird verwendet.

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

Die Antwort ist ganz einfach:

der Operator heißt in dieser Version von rxjs mergeMap

BEARBEITEN:

Darüber hinaus müssen Sie möglicherweise import 'rxjs/add/operator/mergeMap'.

104
Georg Heiler

In meinem Fall musste ich die Erweiterung für mergeMap importieren:

import 'rxjs/add/operator/mergeMap';

Da flatMap ein Alias ​​von mergeMap ist, können Sie flatMap verwenden, indem Sie das obige Modul importieren.

67
Chris Peacock

Mit RxJS 5.5+ wurde der Operator flatMap in mergeMap umbenannt. Stattdessen sollten Sie jetzt den Operator mergeMap in Verbindung mit pipe verwenden.

Sie können flatMap weiterhin mit dem Alias ​​FlatMap verwenden.

RxJS v5.5.2 ist die Standardabhängigkeitsversion für Angular 5.

Für jeden RxJS-Operator, den Sie importieren, einschließlich mergeMap, sollten Sie jetzt aus 'rxjs/operator' importieren und den Pipe-Operator verwenden.

Beispiel für die Verwendung von mergeMap für eine HTTP-Anforderung Observable

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(' '))
    );
  }
  ...
}

Beachten Sie hier, dass flatMap durch mergeMap ersetzt wird und der pipe -Operator verwendet wird, um die Operatoren auf ähnliche Weise zusammenzusetzen, wie Sie es mit Punkt- Verkettung.


Weitere Informationen finden Sie in der rxjs-Dokumentation zu vermietbaren Operatoren. https://github.com/ReactiveX/rxjs/blob/master/doc/ lettable-operators.md

17
Trent

Der richtige Import sollte wie folgt aussehen:

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

Durch das Importieren des Moduls mergeMap können Sie flatMap in Ihrem Code verwenden

Wann werden Sie in Ihren Code importieren? import { Observable } from 'rxjs/Rx';, zusätzlicher mergeMap -Import ist nicht erforderlich, es können jedoch Fehler bei der AoT-Kompilierung auftreten.

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

Schnellaktualisierung - Mai 2019

Verwenden Sie rxjs v6.5.1

Als mergeMap Operator importieren, zB /

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

Dann in Verbindung mit der neuen Funktion pipe verwenden, zB /

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