使用mergeMap和forkJoin时随机订阅流

时间:2018-04-12 17:24:41

标签: angular observable subscribe fork-join

当userId更改时,订阅会随机运行。有时它会,有时我没有。 userId变量来自下拉选择器(Choices库)。

即使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);
    });

1 个答案:

答案 0 :(得分:2)

尝试这样做:

return (roleObservables.length) ? forkJoin(roleObservables) : Observable.of([]);

forkJoin不会使用空数组发出,因此在此代码中,对于没有关联角色的任何用户ID,订阅都不会执行。

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

emptyJoin(obs: Observable<any>[]): Observable<any[]> => (obs.length) ? forkJoin(obs) : Observable.of([]);