RxJs 6 链接多个订阅

RxJs 6 chaining multiple subscriptions

我有一个 Angular 6 应用程序。我正在将 rxjs 升级到 6.

在以前的应用程序版本中,我必须像这样拨打电话...

我调用一个可观察对象 对其结果做某事 然后使用上一个的值调用另一个可观察对象 对其结果做一些事情

请使用 concatmap 执行此操作。代码看起来像这样...

this.service1.getData().concatMap(d1 => {
            this.d1Local = d1;
            return this.service2.getData(d1);
        }).subscribe(
            this.d2Local = d2,
            error => errorFunction);

我正在尝试使用 rxjs6 和 pipe 关键字而不使用 concatmap 重写它。

我目前有...

this._LocationService.getLocation()
    .pipe(           
        map(location => {
            console.log(1);
            this.location = location;
            return this._GeoCoderService.getAddress(location)
                .pipe
                (map(address => {
                this.address = "You are near " + address;
                    this.showSpinner = false;
                }
                ))
            }
        )   
);

我从未看到“1”被记录到控制台。 我应该怎么做?


更新:

我知道有下面的代码。我认为这几乎是正确的,但我没有看到最后的 condole.log print 1....

this._LocationService.getLocation()
    .pipe(map((location: ILocation) => {
        this.location = location;
        return this._GeoCoderService.getAddress(location);
    })
        , catchError(error => { this.showSpinner = false; return throwError('Something went wrong!') })
    ).subscribe(
        tap((address: string) => { console.log(1) })
    );

我错过了什么?

pipe() 之后你应该 .subscribe() (可观察对象是惰性的,如果你只是做 pipe() 它不会触发但 subscribe 会触发)

我不会摆脱 concatMap 运算符。它最适合这份工作。为了使事情更清晰,我也不会将数据存储在 map 运算符中。对于副作用,tap 是可读代码的最佳选择。

this.service1.getData().pipe(
        tap(d1 => this.d1Local = d1),
        concatMap(d1 => this.service2.getData(d1),
    ).subscribe(
        d2 => this.d2Local = d2,
        error => errorFunction);