65

我尝试链接多个 rx.js 可观察对象并传递数据。Flatmap应该是合适的操作员,但导入

import { Observable } from 'rxjs/Observable';

没有找到:

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

使用 rx.js 的版本5.0.0-beta.6

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

6 回答 6

113

事实证明,答案很简单:

mergeMap在这个版本的 rxjs中调用了操作符

编辑:

此外,您可能必须使用import 'rxjs/add/operator/mergeMap'.

于 2016-07-20T13:06:32.973 回答
71

在我的情况下,我需要为 mergeMap 导入扩充:

import 'rxjs/add/operator/mergeMap';

由于 flatMap 是 mergeMap 的别名,导入上面的模块就可以使用 flatMap。

于 2017-05-23T17:47:26.217 回答
28

在 RxJS 5.5+ 中,flatMap操作符已重命名为mergeMap. 相反,您现在应该将mergeMap运算符与pipe.

您仍然可以使用别名来使用 flatMap FlatMap

RxJS v5.5.2 是 Angular 5 的默认依赖版本。

对于您导入的每个 RxJS 运算符,包括mergeMap,您现在应该从 'rxjs/operators' 导入并使用管道运算符。

在 Http 请求 Observable 上使用 mergeMap 的示例

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被替换为mergeMapandpipe运算符用于以与您习惯使用点链类似的方式组合运算符。


有关更多信息,请参阅关于 lettable 运算符的 rxjs 文档 https://github.com/ReactiveX/rxjs/blob/master/doc/lettable-operators.md

于 2017-12-16T02:20:07.020 回答
8

正确的导入应该如下所示:

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/mergeMap';

导入模块mergeMap将使您能够flatMap在代码中使用

当您将在代码中导入时,不需要import { Observable } from 'rxjs/Rx';额外的导入,但您可能会在 AoT 编译期间出现错误。mergeMap

ERROR in ./node_modules/rxjs/_esm5/observable/BoundCallbackObservable.js
Module build failed: TypeError: Cannot read property 'type' of undefined
于 2017-11-22T17:23:29.740 回答
5

快速更新 - 2019 年 5 月

使用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
  })
);
于 2019-05-04T12:45:32.067 回答
-2

它对我有用!

import { Observable } from 'rxjs/Rx';
于 2017-06-25T16:53:07.743 回答