避免使用嵌套的observable

时间:2016-10-04 07:41:26

标签: angular rxjs observable

我需要填写三个具有等级结构的控件:公司,分支机构,员工。 出于用户服务,我当前登录的用户, 然后通过用户的域名我收到他的全部数据作为员工, 然后每个员工的branchId我获得分支对象, 然后我请求所有公司并将控制值设置为 currrent员工,现任分公司和现任分公司。<​​/ p>

我最终得到了嵌套的订阅者树。 我怎样才能避免这种情况并将其重构为更简单?

this.userService.getCurrentlyLoggedInUser().subscribe(
    user => {
        this.user = user;
        this.getEmployee(this.user.domainName).subscribe(
            employees => {
                if (employees.length === 0) {
                    this.isLoading = false;
                    return;
                }
                this.getBranch(employees[0].branchId).subscribe(
                    branches => {
                        if (branches.length === 0) {
                            this.isLoading = false;
                            return;
                        }
                        this.odata.companies().subscribe(
                            companies => {
                                this.setDefaultValues(companies, branches[0], employees[0]);
                                this.isLoading = false;
                            },
                            error => this.isLoading = false
                        );
                    },
                    error => this.isLoading = false
                );
            },
            error => this.isLoading = false
        );
    },
    error => this.isLoading = false
);

1 个答案:

答案 0 :(得分:0)

为了避免嵌套的订阅调用,您始终可以使用{{1}从元分支(例如通过某些AJAX调用或其他异步操作从主分支分叉的流)映射回到主干分支。 }。

有关详细信息,请参阅以下代码。请注意,对中继流只有一个订阅呼叫。所有其他流都mergeMap返回到中继流,因此不需要其他订阅。考虑订阅流来突破RxJS上下文并恢复正常的JS。这只应用于副作用,例如mergeMap命令。

console.log

Working sample on jsbin