Как в Angular + Rxjs выполнить операции внутри потока только тогда(ожидая), когда значение другого потока будет true?

Есть Observable, но пропускать данные нужно только тогда, когда значения другого Observable= true.

Пример - выполняю http запросы, а если токен невалиден, я блокирую выполнение запросов на момент, пока не получу новый токен.... при этом запросы не должны пропасть, как при filter, а просто подождать нового токена(тобеж значения другого Observable).

Как такое реализовать?
export class HttpServiceBase {
      constructor(private tokenService: TokenService) {}
      protected iAmWaitingForNewToken: BehaviorSubject<boolean> = new BehaviorSubject(false);
    
      blockRequestsUntilTokenRefreshed(value: boolean) {
        this.iAmWaitingForNewToken.next(value);
      }
    
      protected checkPipe<T>(source: Observable<T>) {
        return source.pipe(
          map((data) => {
            return {
              data: data,
              hasError: false,
            };
          }),
          catchError(async (err) => {
            return { data: err.error, hasError: true };
          })
        );
      }
    
      protected processOptionsWithToken(options: object = {}) {
        const auth = {
          headers: new HttpHeaders().set(
            'Authorization',
            `Bearer ${this.tokenService.getAccessToken()}`
          ),
        };
        return {
          ...options,
          ...auth,
        };
      }
    }


пример подключения


getWithToken$(url: string) {
        return this.http
          .get(this.hostUrl + url, this.processOptionsWithToken())
          .pipe(this.checkPipe);
      }
  • Вопрос задан
  • 78 просмотров
Пригласить эксперта
Ответы на вопрос 1
Xuxicheta
@Xuxicheta Куратор тега Angular
инженер
придумал ток такое

defer(() => {
  let buffer = [];

  return source$.pipe(
    withLatestFrom(trigger$),
    tap(([src]) => buffer.push(src)),
    mergeMap(([src, trigger]) => trigger ? buffer : NEVER),
    tap(() => buffer = []),
  )
});


где source$ это поток ваших данных, а trigger$ это поток с boolean, который открывает и закрывает, и он должен что-то выдать в начале, используйте startWith(false) для начального значения

Может можно проще с помощью оператора buffer, но чет не придумалось.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы