Цепные наблюдаемые для загрузки зависимых данных - PullRequest
0 голосов
/ 28 августа 2018

Я загружаю сотрудника в свой распознаватель. Этот сотрудник возвращает список идентификаторов города. Я хочу загрузить все города из списка идентификаторов этого города в одном распознавателе. Но я не хочу возвращать список городов, я хочу вернуть работника. Загруженный город будет добавлен в службу кэширования для последующего использования. Вот мой код

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 голосов
/ 28 августа 2018

Вы должны использовать 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;
                })
            );
        })
    );

Основная разница между map и mergeMap:

map(val => of(val)) -> результаты в Observable<Observable<val>>

mergeMap(val => of(val)) -> результаты в Observable<val>

Это эквивалентно .pipe(map(val => of(val)), mergeAll())

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...