Почему охранник не позволяет маршрутизатору активироваться после HTTP-запроса? - PullRequest
0 голосов
/ 09 января 2020

У меня есть сторож, который либо возвращает Observable, либо перенаправляет на другой URL-адрес на основе ответа HTTP. Служба, которую вызывает охранник, выполнит HTTP-вызов или, если она уже была вызвана и сохранена в службе, должна вернуть сохраненное значение. Смотрите сервис ниже. Без оператора if все работает нормально, но с оператором if кажется, что защита не позволяет маршрутизатору активироваться (карта возвращает true). Там нет ошибки в консоли. Заранее спасибо.

Редактировать: Использование Angular 8.1

Служба:

private company: Company;
public companySubject: BehaviorSubject<Company> = new BehaviorSubject(this.company);

get(slug: string, params: HttpParams = null): Observable<Company>
  {
    if (this.company && this.company.slug === slug) {
      this.companySubject.next(this.company);
      return this.companySubject.asObservable();
    }

    return this.http.get<Company>(`companies/${slug}`, {params: params}).pipe(
      tap((response: Company) => {
        this.company = response;
        this.companySubject.next(this.company);
      })
    );
  }

Охрана:

    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean>
  {
    const slug = route.parent.paramMap.get('company');

    return this.companyService.get(slug).pipe(
      tap((company: Company) => {
        if (
          company.locations_count == 0 ||
          !company.subscribed
        ) {
          this.router.navigateByUrl(`/app/company/${slug}/setup`);
        }
      }),
      map(() => true)
    );
  }

1 Ответ

1 голос
/ 09 января 2020

Я думаю, вы можете сделать это проще:

private company: Company;

get(slug: string, params: HttpParams = null): Observable<Company>
{
  if (this.company && this.company.slug === slug) {
    return of(this.company);
  }

   return this.http.get<Company>(`companies/${slug}`, {params: params}).pipe(
      tap((response: Company) => {
        this.company = response;
       }),
       map(res => res)
  );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...