使用 mergeMap 和 forkJoin 时随机订阅流
Randomly subscribes to stream when using mergeMap and forkJoin
当 userId 改变时,订阅是 运行随机的。有时会,有时我不会。 userId 变量来自下拉选择器(选择库)。
不应该总是订阅 运行 即使 userId 是唯一改变的流?
有什么明显的我正在破坏或做错的事情吗?
this.singleUserControl.valueChanges
.mergeMap((userId: number) => {
this.router.navigate([ '/r', 'company-admin', 'user-claims', userId.toString() ]);
this.userRoles = [];
this.claims = [];
const userRolesObserv: Observable<Array<RoleWithClaims>> =
this.claimsService.getUserRoles(userId)
.mergeMap((roles: Array<Role>) => {
const roleObservables = [];
for (const role of roles) {
roleObservables.push(this.claimsService.getClaimsForRole(role.id)
.mapTo(claims => ({
role: role,
claims: claims,
} as RoleWithClaims)));
}
return forkJoin(roleObservables);
});
return forkJoin([
Observable.of(userId),
userRolesObserv,
this.claimsService.getAllClaimsForUser(userId),
]);
})
.subscribe((data: [ number, Array<RoleWithClaims>, Array<Claim>]) => {
this.userSelectedId = data[0];
this.userRoles = data[1]
this.claims = data[2];
}, (error) => {
console.log(error);
});
尝试这样做:
return (roleObservables.length) ? forkJoin(roleObservables) : Observable.of([]);
forkJoin 不会发出空数组,因此在此代码中,不会为没有关联角色的任何用户 ID 执行订阅。
在我所有的 rx 项目中,我都有一个实用函数:
emptyJoin(obs: Observable<any>[]): Observable<any[]> => (obs.length) ? forkJoin(obs) : Observable.of([]);
当 userId 改变时,订阅是 运行随机的。有时会,有时我不会。 userId 变量来自下拉选择器(选择库)。
不应该总是订阅 运行 即使 userId 是唯一改变的流?
有什么明显的我正在破坏或做错的事情吗?
this.singleUserControl.valueChanges
.mergeMap((userId: number) => {
this.router.navigate([ '/r', 'company-admin', 'user-claims', userId.toString() ]);
this.userRoles = [];
this.claims = [];
const userRolesObserv: Observable<Array<RoleWithClaims>> =
this.claimsService.getUserRoles(userId)
.mergeMap((roles: Array<Role>) => {
const roleObservables = [];
for (const role of roles) {
roleObservables.push(this.claimsService.getClaimsForRole(role.id)
.mapTo(claims => ({
role: role,
claims: claims,
} as RoleWithClaims)));
}
return forkJoin(roleObservables);
});
return forkJoin([
Observable.of(userId),
userRolesObserv,
this.claimsService.getAllClaimsForUser(userId),
]);
})
.subscribe((data: [ number, Array<RoleWithClaims>, Array<Claim>]) => {
this.userSelectedId = data[0];
this.userRoles = data[1]
this.claims = data[2];
}, (error) => {
console.log(error);
});
尝试这样做:
return (roleObservables.length) ? forkJoin(roleObservables) : Observable.of([]);
forkJoin 不会发出空数组,因此在此代码中,不会为没有关联角色的任何用户 ID 执行订阅。
在我所有的 rx 项目中,我都有一个实用函数:
emptyJoin(obs: Observable<any>[]): Observable<any[]> => (obs.length) ? forkJoin(obs) : Observable.of([]);