web-dev-qa-db-fra.com

carte manquante de rxjs

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;
              });
      });
  }
56
Georg Heiler

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'.

104
Georg Heiler

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.

67
Chris Peacock

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.

Exemple d'utilisation de mergeMap sur une requête HTTP 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(' '))
    );
  }
  ...
}

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

17
Trent

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
6
rafalkasa

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
  })
);
2
arcseldon