Angular 10 — ожидание, пока служба вернет информацию перед отображением

#angular #google-chrome #firefox #wait

#угловатый #google-chrome #firefox #подожди #angular #подождите

Вопрос:

Я пытаюсь реализовать аутентификацию FusionAuth на сайте и столкнулся с серьезной проблемой с Chrome и Edge, но не с Firefox. Прямо сейчас, в зависимости от тела ответа, он либо автоматически перенаправит вас на страницу входа в FusionAuth, либо направит вас на домашнюю страницу сайта, которая содержится в панели навигации.

 <ng-container *ngIf="this.loggedIn == false; then thenTemplate; else elseTemplate"></ng-container>
<ng-template #thenTemplate>
    <meta http-equiv="refresh" content="0; URL=login_url">
</ng-template>
<ng-template #elseTemplate>
    <app-navbar></app-navbar>
</ng-template>
  

Это служба для сбора информации о пользователях. В компоненте, в котором выполняется проверка, проверяется, содержит ли информация адрес электронной почты или нет, поскольку электронная почта требуется для всех пользователей. Если есть электронное письмо, оно устанавливает для свойства «LoggedIn» значение true, в противном случае оно равно false.

 export class UserService {

  private SERVER_URL = "serverURL";

  constructor(private httpClient: HttpClient) { }

  handleError(error: HttpErrorResponse) {
    let errorMessage = 'Unknown error!';
    if (error.error instanceof ErrorEvent) {
      errorMessage = `Error: ${error.error.message}`;
    } else {
      errorMessage = `Error Code: ${error.status}nMessage: ${error.message}`;
    }
    window.alert(errorMessage);
    return throwError(errorMessage);
  }

  public get() {
    return this.httpClient.get(this.SERVER_URL, {withCredentials: true}).pipe(catchError(this.handleError));
  }
}
  

И, наконец, вот проверка. Я полагаю, что проблема возникает здесь:

   user: any;
  loggedIn: boolean;
  constructor(private userService: UserService){}

  ngOnInit(): void{
    this.userService.get().subscribe((data: any) => {
      if(data.email != null){
        this.loggedIn = true;
      }
      else{
        this.loggedIn = false;
      }
    });
  }
  

На данный момент Firefox каким-то образом может дождаться асинхронного запроса, но Chrome отправляет пользователя через бесконечное перенаправление для входа.

По сути, мой вопрос в том, как я могу заставить Angular ждать обработки запроса на обслуживание и продолжать, пока не будет получена вся информация? Я пытался превратить ответ в обещание и вернуться таким образом, но безуспешно.

Спасибо всем!

Комментарии:

1. Я сам не сталкивался с этим, но я думаю, что вы просите разрешить функциональность

2. httpclient операции являются управляемыми, что означает, что по умолчанию ничего не происходит до тех пор, пока он не будет подписан и запрос не будет возвращен с успехом или ошибкой. где код, который выполняет фактическое перенаправление? просматривая предоставленный вами пример кода, ваш catcherror обработчик открывает предупреждение, но я не вижу перенаправления. есть ли у вас перехватчик, который вы используете, который случайно не скопирован здесь?

3. Это может помочь dev.to/jwp/observable-to-promise-for-async-await-2d9c

4. @Edward перенаправление происходит в операторе IfThenElse в первой записи кода, мета-тег перенаправляет, ЕСЛИ LoggedIn == false . Интересно, есть ли лучший способ настроить логику в самом компоненте для установки тегов, если у вас есть какие-либо предложения, не стесняйтесь, дайте мне знать.

5. Я не видел, чтобы это делалось в шаблоне. Я ожидал увидеть это в классе. Я попытался воспроизвести проблему только с помощью шаблона и создал stackblitz здесь -> ссылка , но там все работает так, как ожидалось. это заставляет меня спросить, нет ли другого места, где loggedIn могло бы быть установлено значение false. Альтернативой было бы обработать перенаправление в классе через window.location.href= или window.location.replace