RxJs 6链接多个订阅

时间:2018-07-11 14:25:32

标签: angular rxjs rxjs6

我有一个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打印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) })
    );

我想念什么?

2 个答案:

答案 0 :(得分:2)

pipe()之后,您应该.subscribe() (可观察对象是懒惰的,如果您只执行pipe()则不会触发,但是subscribe会触发)

答案 1 :(得分:1)

我不会摆脱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);