Угловой HttpInterceptor не стреляет по вложенным Observables - PullRequest
0 голосов
/ 24 марта 2019

У меня есть HttpInterceptor для добавления моего токена Bearer ко всем вызовам моего WebApi.Этот перехватчик отлично работает на всех моих простых сервисных вызовах.

Но у меня есть одно место, где мне нужно вызвать 2 метода и использовать оба результата для построения комбинированной модели.Я уже использовал MergeMap, ForkJoin и FlatMap для вложения наблюдаемых объектов, но ни один из них не вызывает моего HttpInterceptor ...

Это перехватчик

export class JwtInterceptor implements HttpInterceptor {

    constructor(private userService: UserService) { }

    public intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        // add authorization header with jwt token if available
        let currentUser = this.userService.getCurrentUser();
        if (currentUser && currentUser.token) {
            request = request.clone({
                setHeaders: {
                    Authorization: `Bearer ${currentUser.token}`
                }
            });
        }

        return next.handle(request);
    }
}

Служба звонит

public getPriceList(): Observable<CuttingGapPartPrice[]> {
    const list = sessionStorage.getItem(this.listSessionKey);
    if (list) {
        return of(JSON.parse(list) as CuttingGapPartPrice[]);
    }

    return super.getClient()
        .get(`/api/cutting-gap-part-prices`, { headers: super.getHeaders() })
        .pipe(map(response => {
            sessionStorage.setItem(this.listSessionKey, JSON.stringify(response));
            return response ? response as CuttingGapPartPrice[] : new Array<CuttingGapPartPrice>();
        }));
}

public getPowerList(): Observable<MotorPower[]> {
    const list = sessionStorage.getItem(this.listSessionKey);
    if (list) {
        return of(JSON.parse(list) as MotorPower[]);
    }

    return super.getClient()
        .get(`/api/motor-power`, { headers: super.getHeaders() })
        .pipe(map(response => {
            sessionStorage.setItem(this.listSessionKey, JSON.stringify(response));
            return response ? response as MotorPower[] : new Array<MotorPower>();
        }));
}

По отдельности они работают отлично.Но объединенные / вложенные они не имеют.

Вложенный вызов с использованием MergeMap

public getQuotationPrices(quotation: Quotation): Observable<QuotationPrices> {
    return this.cuttingGapPartPriceService.getPriceList().pipe(mergeMap(prices => {
        return this.motorPowerService.getPowerList().pipe(map(powers => {
            var result = new QuotationPrices();
            //Some custom logic

            return result;
        }));
    }));
}

Я знаю, что моя проблема сопоставима с тем, что описано в этом посте, но я просто не понимаю, как мне это исправить.

Редактировать - Вложенный вызов с помощью ForkJoin

public getQuotationPrices(quotation: Quotation): Observable<QuotationPrices> {
    return forkJoin([this.cuttingGapPartPriceService.getPriceList(), this.motorPowerService.getPowerList()]).pipe(map(data => {
        const prices = data[0];
        const powers = data[1];
        var result = new QuotationPrices();


        return result;
    }));
}

Результаты в сетивкладка хромированная Results in network tab of chrome

Ответы [ 2 ]

0 голосов
/ 24 марта 2019

Наконец выяснил в чем проблема. Это не имело ничего общего с наблюдаемыми. Я предоставил перехватчики в AppModule, но они снова были переопределены моим SharedModule, потому что я снова импортировал HTTPClientModule из angular. Проблема была устранена после удаления дубликата импорта.

0 голосов
/ 24 марта 2019

Попробуйте сгладить вложенные наблюдаемые. Возможно, ваши внутренние наблюдаемые не получают подписку (Наблюдаемые не запускаются, если они не подписаны) . Вы можете проверить этот пример стекаблика , чтобы увидеть, как вложенные наблюдаемые не работают, если вы не подписаны на innerObservables или не сгладили их. Также, как предлагает @JB Nizet, было бы здорово, если бы вы могли создать репо на stackblitz

...