rxjs помощью flatMap отсутствует

Я пытаюсь связать несколько rx.js наблюдаемые и передают данные. Flatmap должен быть подходящим оператором, но с импортом

import { Observable } from 'rxjs/Observable';

не нашел:

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

версия 5.0.0-beta.6 rx.используется JS-это.

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

5 ответов


оказывается, ответ довольно прост:

оператор называется mergeMap в этой версии rxjs

EDIT:

кроме того, возможно, вам придется использовать 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.

для каждого импортируемого оператора RxJS, включая mergeMap, теперь вы должны импортировать из 'RxJS / operators' и использовать трубу оператор.

пример использования mergeMap для 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(' '))
    );
  }
  ...
}

обратите внимание, что flatMap заменяется mergeMap и pipe оператор используется для составления операторов аналогично тому, к чему вы привыкли с точечной цепочкой.


посмотреть rxjs документации на операторов арендопригодная дополнительные info 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

это сработало для меня!

import { Observable } from 'rxjs/Rx';