我很难使用Observables
的力量,即RxJs 6
来正确pipe, tap, map, mergemap
或我的HttpClient
所要求的任何东西。具有所有不同功能的版本地狱使得它不太容易...
因此,我需要先进行一次REST调用,然后根据结果进行第二次REST调用,然后将可能接收到的两个数据对象映射到一个新数据对象中。该函数应返回一个Observable
。
因此,目前,我可以通过subject
来解决该问题,从而可以手动/顺序执行所需的操作。该函数返回Subject
,在这种情况下不是Observable。但是由于调用方只是订阅了此功能,因此它可以工作。
值得一提的是,下面的两个服务功能(userService.loadUserDetails()
和adminService.getAdminData()
)仅返回它们从HttpClient
获得的可观测值。
所以有人可以帮助我将下面的示例代码转换为典型的 RxJs 6 代码吗?
myFunction(): Observable<any> {
const s = new Subject();
let obj: any = {};
this.userService.loadUserDetails().subscribe((userDetails) => {
obj.user = userDetails;
if (userDetails.authorities.includes('ADMIN')) {
this.adminService.getAdminData().subscribe((adminData) => {
obj.adminData = adminData;
s.next(obj);
s.complete();
});
} else {
s.next(obj);
s.complete();
}
});
return s;
}
答案 0 :(得分:2)
使用mergeMap
进行连锁并有条件地返回
更新:将mergeMap更改为switchMap,以防内部observable是连续流,并且当源observable发出时,它也会取消内部observable。
[0,1,1,1,2,2,2,3,3,3,4]
答案 1 :(得分:2)
您可以创建自己的观察者。 import { Observable } from 'rxjs/Observable';
return Observable.create(observer => {
this.userService.loadUserDetails().subscribe((userDetails) => {
obj.user = userDetails;
if (userDetails.authorities.includes('ADMIN')) {
this.adminService.getAdminData().subscribe((adminData) => {
obj.adminData = adminData;
observer.next(obj);
});
} else {
observer.next(obj);
}
});
});