Angular 使用mergeMap和forkJoin时随机订阅流

Angular 使用mergeMap和forkJoin时随机订阅流,angular,observable,subscribe,fork-join,Angular,Observable,Subscribe,Fork Join,当用户ID更改时,订阅将随机运行。有时会,有时我不会。userId变量来自下拉选择器(选项库) 即使userId是唯一更改的流,subscribe不应该总是运行吗 是否有任何明显的迹象表明我正在破坏或做错事 this.singleUserControl.valueChanges .mergeMap((userId: number) => { this.router.navigate([ '/r', 'company-admin', 'user-claims', us

当用户ID更改时,订阅将随机运行。有时会,有时我不会。userId变量来自下拉选择器(选项库)

即使userId是唯一更改的流,subscribe不应该总是运行吗

是否有任何明显的迹象表明我正在破坏或做错事

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);
    });
this.singleUserControl.valueChanges
.mergeMap((用户ID:number)=>{
this.router.navigate(['/r','company admin','user claims',userId.toString()]);
this.userRoles=[];
这个。索赔=[];
const userRolesObserv:可观察=
this.claimsService.getUserRoles(userId)
.mergeMap((角色:数组)=>{
常量roleObservables=[];
for(角色的常量角色){
roleObservables.push(this.claimsService.getClaimsForRole(role.id))
.mapTo(索赔=>({
角色:角色,,
索赔:索赔,
}如RoleWith索赔);
}
返回forkJoin(roleObservables);
});
返回叉连接([
可观察的(用户ID),
userRolesObserv,
this.claimsService.getAllClaimsForUser(userId),
]);
})
.subscribe((数据:[数字,数组,数组])=>{
this.userSelectedId=data[0];
this.userRoles=数据[1]
此项索赔=数据[2];
},(错误)=>{
console.log(错误);
});
尝试执行以下操作:

return (roleObservables.length) ? forkJoin(roleObservables) : Observable.of([]);
forkJoin不会使用空数组发出,因此在这段代码中,不会对没有关联角色的任何用户id执行subscribe

在我所有的rx项目中,我都有一个实用功能:

emptyJoin(obs: Observable<any>[]): Observable<any[]> => (obs.length) ? forkJoin(obs) : Observable.of([]);
emptyJoin(obs:Observable[]):Observable=>(obs.length)?分叉连接(obs):可观察到的([]);

forkJoin仅在其内部的所有项目都已完成时发出。您可能看到的是,有时所有项目都已完成,有时它们并不依赖于所有内部项目查看此代码,您已经是rxjs方面的专家。我建议的一件事是,您是否检查了forkJoin是否仅在所有可观察对象完成时才会发出值,否则它不会发出值。如果用户ID始终处于活动状态,forkJoin将永远不会发出值。你真是太棒了!这就是交易。万分感谢!!