根据先前响应的结果顺序级联 Observables 并重新映射到新数据对象

Sequential cascade Observables according result from previous response and remap to new data object

我很难使用 Observables 的力量,即 RxJs 6 来正确地 pipe, tap, map, mergemap 或任何我的 HttpClient 请求。各种不同功能的版本地狱使它变得不是很容易...

所以我需要先进行 REST 调用,然后根据结果可能进行第二次 REST 调用并将可能接收到的两个数据对象映射到一个新数据对象中。该函数应该 return 一个 Observable.

所以目前,我用 subject 解决了它,我可以手动/按顺序执行我需要的操作。函数 return 是一个 Subject,在这种情况下不是 Observable。但是由于调用者只是订阅了这个函数,所以它起作用了。 值得一提的是,下面的两个服务函数(userService.loadUserDetails()adminService.getAdminData())只是从 HttpClient.

获得的 returns observables

所以有人可以帮我将下面的示例代码翻译成典型的 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;
}

使用mergeMap链接和return有条件

更新:将 mergeMap 更改为 switchMap Incase inner observable 是一个连续的流,当源 observable 发出时它也会取消 inner observable 。

    this.userService.loadUserDetails().pipe(
    switchMap(user=>
      user.authorities.includes('ADMIN')) ?
      this.adminService.getAdminData().map(adminData=>({adminData,user})):
      Observable.of({user}))
      )
    .subscribe();

您可以创建自己的观察者。 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);
        }
    });
});