链接可观察对象以加载依赖数据
Chain observables to load dependent datas
我正在我的解析器中加载一名员工。该员工 return 列出了城镇 ID。
我想在同一个解析器中加载这个城镇的 ID 列表中的所有城镇。但我不想 return 城镇的名单,我想 return 雇员。
加载的城镇将添加到缓存服务中以备后用。
这是我的代码
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 并且我的组件中的路由快照数据 return 是 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']);
}
问题:在解析器中不 return 加载相关数据的正确方法是什么?我正要尝试使用两个单独的解析器,但无法链接解析器(无法告诉解析器 B 使用来自解析器 A 的数据)。
我正在使用 Angular 6 和 RXJS ^6.2.1。
如果您想订阅 forkJoin
,您应该使用 mergeMap
。
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;
})
);
})
);
map
和mergeMap
的主要区别:
map(val => of(val))
-> 结果为 Observable<Observable<val>>
mergeMap(val => of(val))
-> 结果为 Observable<val>
相当于.pipe(map(val => of(val)), mergeAll())
我正在我的解析器中加载一名员工。该员工 return 列出了城镇 ID。 我想在同一个解析器中加载这个城镇的 ID 列表中的所有城镇。但我不想 return 城镇的名单,我想 return 雇员。 加载的城镇将添加到缓存服务中以备后用。 这是我的代码
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 并且我的组件中的路由快照数据 return 是 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']);
}
问题:在解析器中不 return 加载相关数据的正确方法是什么?我正要尝试使用两个单独的解析器,但无法链接解析器(无法告诉解析器 B 使用来自解析器 A 的数据)。
我正在使用 Angular 6 和 RXJS ^6.2.1。
如果您想订阅 forkJoin
,您应该使用 mergeMap
。
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;
})
);
})
);
map
和mergeMap
的主要区别:
map(val => of(val))
-> 结果为 Observable<Observable<val>>
mergeMap(val => of(val))
-> 结果为 Observable<val>
相当于.pipe(map(val => of(val)), mergeAll())