在Angular 2+中,条件观察映射是一种常见的模式,它可以根据某些条件从一个Observable流中动态地选择不同的流。这可以通过使用rxjs中的一些操作符来实现,如switchMap、mergeMap、concatMap等。
下面是一个示例代码,在这个示例中,我们从一个http请求的observable流中获取用户数据,然后根据他们的年龄从不同的数据流中获取他们的就业数据。
import { Observable, of } from 'rxjs';
import { map, switchMap } from 'rxjs/operators';
import { HttpClient } from '@angular/common/http';
interface User {
id: number;
name: string;
age: number;
}
interface Employment {
id: number;
userId: number;
company: string;
salary: number;
}
@Component({
selector: 'app-user-employment',
templateUrl: './user-employment.component.html',
styleUrls: ['./user-employment.component.scss']
})
export class UserEmploymentComponent implements OnInit {
users$: Observable;
employments$: Observable;
constructor(private httpClient: HttpClient) { }
ngOnInit() {
this.users$ = this.httpClient.get('/users');
this.employments$ = this.users$.pipe(
switchMap(users => {
const youngUsers$ = of(users.filter(user => user.age < 25));
const midAgeUsers$ = of(users.filter(user => user.age >= 25 && user.age <= 45));
const oldUsers$ = of(users.filter(user => user.age > 45));
return youngUsers$.pipe(map(() => this.httpClient.get('/youngUsersEmployments')))
.pipe(switchMap(s => s), map((emps: any) => emps.result))
.pipe(concat(midAgeUsers$.pipe(map(() => this.httpClient.get('/middleAgedUsersEmployments')))
.pipe(switchMap(s => s), map((emps: any) => emps.result))))
.pipe(concat(oldUsers$.pipe(map(() => this.httpClient.get('/oldUsersEmploy