我有一个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) })
);
我想念什么?
答案 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);