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