У меня проблема с перехватчиком 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
Установка выглядит следующим образом:
- login.service.ts: этот сервис инкапсулирует аутентифицированного пользователя. Это делается с помощью BehaviorSubject и соответствующего Observable. Первоначально субъект инициализируется значением NULL, которое указывает, что пользователь не вошел в систему.
- строка login.component.ts строка 17: как только маршрут / логин открыт, мы имитируем запрос, который должен аутентифицировать пользователя. Запрос просто возвращает пользователя из jsonplaceholder, который имитирует успешный вход в систему.
- Мы заполняем пользователя с помощью LoginService, чтобы все заинтересованные стороны / наблюдатели получали информацию о вновь вошедшем пользователе. Одной из этих заинтересованных сторон является http-перехватчик.
Чтобы воспроизвести проблему, откройте перехватчик http на StackBlitz и раскомментируйте строки, как описано там. В консоли разработчика вы увидите повторяющиеся сообщения журнала, которые появляются в бесконечном цикле. Остерегайтесь: если вы будете ждать слишком долго, это приведет к сбою вкладки / окна браузера! Так что, если вы раскомментируете быстро, закомментируйте строки снова после того, как сможете воспроизвести проблему! В StackBlitz вы можете просто использовать комбинацию клавиш STRG + / для переключения комментариев на несколько строк!
Заранее большое спасибо!