У меня есть 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;
}));
}
Результаты в сетивкладка хромированная