canActivate и NGXS селектор - PullRequest
       0

canActivate и NGXS селектор

0 голосов
/ 21 апреля 2020

У меня есть селектор NGXS в SomeService

@Select(state => state.sample)
public sample$: Observable<Sample>;

Я использую его внутри Angular RouteGuard, как это

getSample(): boolean {
    this.someService.sample$.subscribe({
      next: (sample: Sample) => {
        if (isValid(sample)) {
          return true;
        } else {
          return false;
        }
      },
      error: () => {
        return false;
      }
    });
  }

  canActivate(): boolean {
    return this.getSample();
  }

Я получаю ошибку 'Функция, объявленный тип не является ни 'void', ни 'any', которое должно возвращать значение '. Я знаю причину, потому что она не вернула ничего за пределами подписки, но я хочу вернуться только после выполнения подписки.

1 Ответ

1 голос
/ 21 апреля 2020

Вы должны сделать что-то вроде этого:

// You cannot return the value the way you were trying to do. 
// The following snippet shows the right way to do it.
// Notice we're returning an observable instead of a boolean.
// And we are making sure that the observable completes after
// the first emission, by using the `take(1)` operator
getSample(): Observable<boolean> {
  return this.someService.sample$.pipe(
    // Convert the sample to true or false according to isValid
    map((sample: Sample) => isValid(sample)),
    // The observable must complete for canActivate get into action
    take(1)
  }
}

// Can activate can return an Observable<boolean> as long
// as it completes.
canActivate(): Observable<boolean> {
  return this.getSample();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...