Маршрутная охрана не работает с 2 наблюдаемыми - PullRequest
0 голосов
/ 04 мая 2019

Я написал route guard, как показано ниже.Но в операторе else, где это никогда не возвращает результат.Но это имеет результат.И никаких ошибок тоже.this.hotelSettingsService.get().pipe(map(res => { if (res) {

Это работает, если я удаляю этот from(this.localStorageService.get(LocalStorage.SCROLL_VIEW_HOLDER)).pipe(map(path раздел.

Я думаю, что я сделал что-то в корне неправильно.Любая подсказка?

Видео об этом поведении: Видео

 canActivate(): Observable<boolean> {

    return from(this.localStorageService.get(LocalStorage.SCROLL_VIEW_HOLDER)).pipe(map(path => {
      if (path) {
        this.router.navigate(path);
        return true;
      } else {
        this.hotelSettingsService.get().pipe(map(res => {
          if (res) { // not come to here
            this.router.navigate([this.getLandingPage(environment.hotelName)]);
            return true;
          }
        }), catchError((err) => {
          return of(false);
        }));
      }
    }), catchError((err) => {
      return of(false);
    }));
  }

Когда я ставлю return:

enter image description here

Работает нормально:

canActivate(): Observable<boolean> {

        return this.hotelSettingsService.get().pipe(map(res => {
              if (res) { 
                this.router.navigate([this.getLandingPage(environment.hotelName)]);
                return true;
              }
            }), catchError((err) => {
              return of(false);
            }));
          }
     }

1 Ответ

1 голос
/ 04 мая 2019

Сначала вам нужно добавить return перед this.hotelService...., как вы добавили на своем изображении.Затем вам нужно сгладить результат, используя switchMap вместо map:

 canActivate(): Observable<boolean> {
    // since we have (possibly) an inner observable, flatten the result
    return from(...).pipe(switchMap(path => {
      if (path) {
        this.router.navigate(path);
        // return observable of
        return of(true);
      } else {
        return this.hotelSettingsService.get().pipe(map(res => {
          if (res) {
            this.router.navigate([this.getLandingPage(environment.hotelName)]);
            return true;
          }
        }), catchError((err) => {
          return of(false);
        }));
      }
    }), catchError((err) => {
      return of(false);
    }));
  }
...