根据先前响应的结果顺序级联 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);
}
});
});
我很难使用 Observables
的力量,即 RxJs 6
来正确地 pipe, tap, map, mergemap
或任何我的 HttpClient
请求。各种不同功能的版本地狱使它变得不是很容易...
所以我需要先进行 REST 调用,然后根据结果可能进行第二次 REST 调用并将可能接收到的两个数据对象映射到一个新数据对象中。该函数应该 return 一个 Observable
.
所以目前,我用 subject
解决了它,我可以手动/按顺序执行我需要的操作。函数 return 是一个 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;
}
使用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);
}
});
});