Ответ 1
Оказывается, ответ довольно прост:
оператор называется mergeMap
в этой версии rxjs
РЕДАКТИРОВАТЬ:
Кроме того, вам, возможно, придется использовать import 'rxjs/add/operator/mergeMap'
.
Я пытаюсь связать несколько наблюдаемых 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;
});
});
}
Оказывается, ответ довольно прост:
оператор называется mergeMap
в этой версии rxjs
РЕДАКТИРОВАТЬ:
Кроме того, вам, возможно, придется использовать 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/operator' и использовать оператор pipe.
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
Правильный импорт должен выглядеть следующим образом:
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
Быстрое обновление - май 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
})
);
Это сработало для меня!
import { Observable } from 'rxjs/Rx';