rxjs flatmap缺失

Geo*_*ler 57 reactive-extensions-js observable rxjs

我尝试链接多个rx.js可观察量并传递数据.Flatmap应该是拟合运算符但是导入

import { Observable } from 'rxjs/Observable';
Run Code Online (Sandbox Code Playgroud)

找不到:

Error TS2339: Property 'flatmap' does not exist on type 'Observable<Coordinates>'
Run Code Online (Sandbox Code Playgroud)

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;
              });
      });
  }
Run Code Online (Sandbox Code Playgroud)

Geo*_*ler 106

事实证明答案很简单:

mergeMap在此版本的rxjs中调用该运算符

编辑:

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

  • 而flatMap是它的别名,但是使用大写的M (5认同)

Chr*_*ock 68

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

import 'rxjs/add/operator/mergeMap';
Run Code Online (Sandbox Code Playgroud)

由于flatMap是mergeMap的别名,因此导入上面的模块将使您能够使用flatMap.


Tre*_*ent 20

使用RxJS 5.5+,flatMap运算符已重命名为mergeMap.相反,您现在应该mergeMap结合使用运算符pipe.

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

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

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

在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(' '))
    );
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)

请注意,这里flatMap替换为mergeMappipe运算符用于组合运算符的方式与您用于点链的方式类似.


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


raf*_*asa 6

正确导入应如下所示:

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/mergeMap';
Run Code Online (Sandbox Code Playgroud)

导入模块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
Run Code Online (Sandbox Code Playgroud)


arc*_*don 5

快速更新 - 2019 年 5 月

使用rxjs v6.5.1

作为mergeMap操作符导入,例如/

import { Observable, from, of } from "rxjs";
import { map, filter, mergeMap } from "rxjs/operators";
Run Code Online (Sandbox Code Playgroud)

然后与新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
  })
);
Run Code Online (Sandbox Code Playgroud)