Возврат данных из цепочек наблюдаемых в распознаватель, подождите, пока все данные будут получены - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть угловой преобразователь для предоставления данных для компонента.Я использую ngrx.Я хочу проверить, есть ли в магазине 2 куска данных (автомобиль и его производитель), если нет, отправьте действие для получения данных из 2 отдельных API.Сначала я получаю автомобиль, основываясь на параметре URL, когда у меня есть машина, мне нужно, чтобы производитель отправлял ID автомобиля в API.Когда оба запроса выполнены, и у меня есть и автомобиль, и его производитель, я хочу объединить данные (добавить производителя как свойство автомобиля) и вернуть объект car в распознаватель.

export class CardResolverService implements Resolve <Observable<any>> {

    private cardId: string;
    private cardLoaded$ = new Subject();
    private makerLoaded$ = new Subject();
    private car: Car;

    constructor(private store: Store<any>) {

    }

    // Check if car is in store, otherwise dispatch action to call API
    // Once the car is loaded, get its maker based on one of its properties
    private initCar(): void {
        this.store.select(CarSelectors.getCardById(this.cardId)).pipe(
            takeUntil(this.cardLoaded$)
        ).subscribe((car) => {
            if (!car) {
                this.store.dispatch(new CarSelectors.LoadCarByIdAction(this.cardId));
            } else {
                this.cardLoaded$.next(true);
                this.car = car;
                this.getCarMaker(car.makerId);
            }
        });
    }

    private getCarMaker(makerId: string) {
        this.store.select(MakerSelectors.getMakerById(makerId)).pipe(
            takeUntil(this.makerLoaded$)
        ).subscribe((maker) => {
            if (!maker) {
                this.store.dispatch(new MakerActions.LoadMakerByIdAction(makerId));
            } else {
                this.car.maker = maker;
                this.makerLoaded$.next(true);
            }

        });
    }

    // I need to wait until both car and maker are loaded to return the car object
    private waitForData(): Observable<TeamMemberView> {
        return this.carLoaded$.pipe(
                withLatestFrom(this.makerLoaded$),
                map(() => this.car)
        );

    }

    resolve(route: ActivatedRouteSnapshot): Observable<any> {
        // Get car ID from url
        this.carId = route.params['carId'];
        this.initCar();
        return this.waitForData(); // Here is where I need help
    }
}

В методе waitForData я пытаюсь проверить, возвращали ли обе наблюдаемые объекты автомобиль и создатель значения через субъекты и, если они есть, возвращали объект автомобиля.Но метод waitForData ничего не возвращает.

...