J'essaie de chaîner plusieurs observables rx.js et de transmettre les données. Flatmap
devrait être l’opérateur d’ajustement mais avec une importation de
import { Observable } from 'rxjs/Observable';
il n'est pas trouvé:
Error TS2339: Property 'flatmap' does not exist on type 'Observable<Coordinates>'
Version 5.0.0-beta.6
de rx.js est utilisé.
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;
});
});
}
Il s'avère que la réponse est assez simple:
l'opérateur s'appelle mergeMap
dans cette version de rxjs
MODIFIER:
De plus, vous devrez peut-être utiliser import 'rxjs/add/operator/mergeMap'
.
Dans mon cas, je devais importer l'augmentation pour mergeMap:
import 'rxjs/add/operator/mergeMap';
FlatMap étant un alias de mergeMap, l'importation du module ci-dessus vous permettra d'utiliser flatMap.
Avec RxJS 5.5+, l'opérateur flatMap
a été renommé en mergeMap
. À la place, vous devriez maintenant utiliser l'opérateur mergeMap
en conjonction avec pipe
.
Vous pouvez toujours utiliser flatMap en utilisant l'alias FlatMap
.
RxJS v5.5.2 est la version de dépendance par défaut pour Angular 5.
Pour chaque opérateur RxJS que vous importez, y compris mergeMap
, vous devez maintenant importer à partir de 'rxjs/operators' et utiliser l'opérateur de canal.
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(' '))
);
}
...
}
Notez ici que flatMap
est remplacé par mergeMap
et que l’opérateur pipe
est utilisé pour composer les opérateurs de la même manière que ce à quoi vous êtes habitué avec chaînage.
Voir la documentation de rxjs sur les opérateurs locatifs pour plus d'informations https://github.com/ReactiveX/rxjs/blob/master/doc/ lettable-operators.md
L'importation correcte devrait ressembler à celle ci-dessous:
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/mergeMap';
Importer le module mergeMap
vous permettra d’utiliser flatMap
dans votre code
Quand vous importerez dans votre code import { Observable } from 'rxjs/Rx';
, une importation supplémentaire mergeMap
n’est pas nécessaire, mais vous pouvez vous attendre à des erreurs lors de la compilation AoT.
ERROR in ./node_modules/rxjs/_esm5/observable/BoundCallbackObservable.js
Module build failed: TypeError: Cannot read property 'type' of undefined
Mise à jour rapide - Mai 2019
Utilisation de rxjs v6.5.1
Importer en tant qu'opérateur mergeMap
, par exemple /
import { Observable, from, of } from "rxjs";
import { map, filter, mergeMap } from "rxjs/operators";
Puis utilisez en conjonction avec la nouvelle fonctionnalité pipe
, par exemple /
var requestStream = of("https://api.github.com/users");
var responseStream = requestStream.pipe(
mergeMap(requestUrl => {
console.log(requestUrl);
... // other logic
return rp(options); // returns promise
})
);