Запрос запускается бесконечно при использовании наблюдаемого в http-перехватчике - PullRequest
0 голосов
/ 09 января 2019

У меня проблема с перехватчиком http, который зависит от наблюдаемого. Все это заканчивается бесконечным циклом, вызывающим один и тот же URL снова и снова. Однако я искал другие решения, подобные моему (см., Например, Async HTTP Interceptors с Angular 4.3 ), и я не вижу большой разницы, за исключением другой версии rxjs. Перехватчик выглядит следующим образом:

@Injectable()
export class MyHttpInterceptor implements HttpInterceptor {

  constructor(private loginSvc: LoginService) {}

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {    
    return this.loginSvc.currentUser$.pipe(
      mergeMap(x => {
        if (x) {
          console.log("User is authenticated, usually I would add a bearer token to the request here...");
        }
        return next.handle(req);
      })
    );
  }
}

Может кто-нибудь указать на мою ошибку, которую я совершил в этом перехватчике Angular http? Вы можете увидеть весь рабочий пример здесь:

https://stackblitz.com/edit/angular-cazgsa?file=src%2Fapp%2Fservices%2Fmy-http-interceptor.service.ts

Установка выглядит следующим образом:

  1. login.service.ts: этот сервис инкапсулирует аутентифицированного пользователя. Это делается с помощью BehaviorSubject и соответствующего Observable. Первоначально субъект инициализируется значением NULL, которое указывает, что пользователь не вошел в систему.
  2. строка login.component.ts строка 17: как только маршрут / логин открыт, мы имитируем запрос, который должен аутентифицировать пользователя. Запрос просто возвращает пользователя из jsonplaceholder, который имитирует успешный вход в систему.
  3. Мы заполняем пользователя с помощью LoginService, чтобы все заинтересованные стороны / наблюдатели получали информацию о вновь вошедшем пользователе. Одной из этих заинтересованных сторон является http-перехватчик.

Чтобы воспроизвести проблему, откройте перехватчик http на StackBlitz и раскомментируйте строки, как описано там. В консоли разработчика вы увидите повторяющиеся сообщения журнала, которые появляются в бесконечном цикле. Остерегайтесь: если вы будете ждать слишком долго, это приведет к сбою вкладки / окна браузера! Так что, если вы раскомментируете быстро, закомментируйте строки снова после того, как сможете воспроизвести проблему! В StackBlitz вы можете просто использовать комбинацию клавиш STRG + / для переключения комментариев на несколько строк!

Заранее большое спасибо!

1 Ответ

0 голосов
/ 10 января 2019

Я отладил твой код.

Когда ваш http-запрос завершается, вы вводите новое значение в тему пользователя (метод signIn). Ваш поток прерывателя зависит от currentUser$, как только поступает новое пользовательское значение, прерыватель запускается заново. Я исправил прерыватель, чтобы избежать этой проблемы, и остановился в зависимости от текущего пользователя.

https://stackblitz.com/edit/angular-vbca4p?file=src%2Fapp%2Fservices%2Fmy-http-interceptor.service.ts

...