链式可观察对象加载相关数据

时间:2018-08-28 15:49:45

标签: angular rxjs resolver angular-resolver

我在解析器中加载一名员工。该员工返回城镇ID列表。 我想从同一城镇的ID列表中加载所有城镇。但是我不想返回城镇清单,我想返回员工。 加载的城镇将添加到缓存服务中,以供以后使用。 这是我的代码

resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<any> {

    return this.employeeService.getEmployee(route.params['id'])
        .pipe(
            map(employee => {
                const townsObservables = [];
                employee['town_list'].forEach((townId) => {
                    townsObservables.push(this.townService.getTown(townId));
                });
                return forkJoin(townsObservables).pipe(
                    map(town => {
                        this.townCache.addTown(town);
                        return employee;
                    })
                );
            })
        );
}

问题:永远不会执行forkJoin,并且组件中的路由快照数据将返回Observalbe而不是雇员。

route.snapshot.data['employee'] // returns Observable {_isScalar: false, source: Observable, operator: MapOperator}

employeeService在管道中没有所有代码的情况下运行良好,此代码的工作方式与预期的一样(我可以在我的快照数据中获取我的员工):

resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<any> {
    return this.employeeService.getEmployee(route.params['id']);
}

问题:加载相关数据而不在解析器中返回相关数据的正确方法是什么?我正要尝试使用两个单独的解析器,但无法链接解析器(无法告诉解析器B使用解析器A中的数据)。

我正在将Angular 6与RXJS ^ 6.2.1一起使用

1 个答案:

答案 0 :(得分:1)

如果要订阅mergeMap,则应使用forkJoin

return this.employeeService.getEmployee(route.params['id'])
    .pipe(
        mergeMap(employee => { // <-- HERE changed to mergeMap
            const townsObservables = [];
            employee['town_list'].forEach((townId) => {
                townsObservables.push(this.townService.getTown(townId));
            });
            return forkJoin(townsObservables).pipe(
                map(town => {
                    this.townCache.addTown(town);
                    return employee;
                })
            );
        })
    );

mapmergeMap之间的主要区别:

map(val => of(val))->产生Observable<Observable<val>>

mergeMap(val => of(val))->产生Observable<val>

它等效于.pipe(map(val => of(val)), mergeAll())