Подтвердить что ты не робот

Отсутствует 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;
              });
      });
  }
4b9b3361

Ответ 1

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

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

РЕДАКТИРОВАТЬ:

Кроме того, вам, возможно, придется использовать import 'rxjs/add/operator/mergeMap'.

Ответ 2

В моем случае мне нужно было импортировать дополнение для mergeMap:

import 'rxjs/add/operator/mergeMap';

Поскольку flatMap является псевдонимом mergeMap, импорт модуля выше позволит вам использовать flatMap.

Ответ 3

В RxJS 5. 5+ оператор flatMap был переименован в mergeMap. Вместо этого вы должны теперь использовать оператор mergeMap вместе с pipe.

Вы все еще можете использовать flatMap, используя псевдоним FlatMap.

RxJS v5.5.2 - версия зависимостей по умолчанию для Angular 5.

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

Пример использования 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 по операторам lettable. Https://github.com/ReactiveX/rxjs/blob/master/doc/lettable-operators.md

Ответ 4

Правильный импорт должен выглядеть следующим образом:

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

Ответ 5

Быстрое обновление - май 2019

Использование rxjs v6.5.1

Импортировать как оператор mergeMap, например, /

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

Затем используйте вместе с новой функцией pipe, например, /

var requestStream = of("https://api.github.com/users");
var responseStream = requestStream.pipe(
  mergeMap(requestUrl => {
    console.log(requestUrl);
    ... // other logic
    return rp(options);  // returns promise
  })
);

Ответ 6

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

import { Observable } from 'rxjs/Rx';