根据先前响应的结果进行顺序级联可观察对象,并重新映射到新数据对象

时间:2018-06-22 05:18:43

标签: angular rxjs angular6 rxjs6

我很难使用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;
}

2 个答案:

答案 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);
        }
    });
});