Возврат наблюдаемого из наблюдаемого в Angular HttpInterceptor

Я использую @ngrx/store, чтобы получить токен из хранилища и поместить его в заголовки HTTP, я пытался использовать flatmap mergeMap, но все они продолжают дублировать HTTP-запросы, и когда я использую take (1), он продолжается. запрос цикла и зависает, это то, что у меня есть:

@Injectable()
export class AuthInterceptorService implements HttpInterceptor {
   token$: Observable<string>;

   constructor(private readonly store: Store<fromRoot.State>) {
      this.token$ = store.select(fromAuth.getToken);
   }

   intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

        return this.token$
               .map(token => {
                  if (token) {
                     request = request.clone({setHeaders: {Authorization: `Bearer ${token}`}});
                  }
               })
              .mergeMap(() => next.handle(request));
   }
}

person ramon22    schedule 30.10.2017    source источник
comment
вам, вероятно, просто нужно использовать switchMap и фактически передать измененный запрос через поток.   -  person bryan60    schedule 30.10.2017


Ответы (1)


return this.token$
           .map(token => {
              if (token) {
                 request = request.clone({setHeaders: {Authorization: `Bearer ${token}`}});
              }
              return request;
           })
          .switchMap((req) => next.handle(req));

Карта переключения берет одну наблюдаемую и переключает ее на другую. Вам также необходимо фактически передать значение при использовании карты в наблюдаемой последовательности. Лично я бы даже сделал запрос частью исходного наблюдаемого потока.

person bryan60    schedule 30.10.2017
comment
он по-прежнему удваивает запросы от клиента для каждого HTTP-запроса. - person ramon22; 30.10.2017
comment
вам, вероятно, также нужно взять (1): this.token$.take(1).map(...).switchMap(...) - person Brandon; 30.10.2017
comment
Я собираюсь пойти на риск и сказать, что ваши наблюдаемые удваивают запросы, потому что вы где-то случайно подписались дважды. вы подтвердили, что он запускается только один раз, если вы не перехватываете? - person bryan60; 30.10.2017
comment
Я добавил дубль и передал значение в карту переключения, и теперь это работает, спасибо - person ramon22; 31.10.2017