Да, вы можете сделать это более элегантно.
Давайте рассмотрим это шаг за шагом :)
1) Используйте filter
из rxjs вместо оператора if
this.userSub = this
.user$
.filter((user: IUser) => user.id !== null)
.subscribe((user: IUser) => this.router.navigate(['/app']));
2) Избегайте обработки подписок по очереди
(есть отличная статья от Бена Леша на Medium об этом)
private componentDestroyed$: new Subject<void>();
ngOnInit() {
this
.user$
.filter((user: IUser) => user.id !== null)
.takeUntil(this.componentDestroyed$)
.subscribe(_ => this.router.navigate(['/app']));
}
ngOnDestroy() {
this.componentDestroyed$.next();
this.componentDestroyed$.complete();
}
3) Не применяйте свою логику внутри subscribe
Используйте do
или map
для обработки своей логики перед подпиской.
- do
если вам просто нужно что-то сделать
- map
если вы хотите вернуть результат
this
.user$
.filter((user: IUser) => user.id !== null)
.takeUntil(this.componentDestroyed$)
.do(_ => this.router.navigate(['/app']))
.subscribe();
(CF следующая часть "почему")
4) Используйте "селекторы", если хотите повторно использовать или экспортировать логику
Если бы мне пришлось догадываться о вашем коде, я полагаю, что ваш user $ является текущим пользователем. Тот, что подключен правильно? И вам, возможно, придется скопировать весь этот код в другую часть вашего приложения, чтобы снова найти этого пользователя.
Это хороший вариант использования "селектора" .
(Я экспортировал здесь 2 функции, чтобы этот код был удобен для AOT).
export function _getCurrentUser(store: Store<any>) {
return store$
.select(state => state.user)
.filter((user: IUser) => user.id !== null);
}
А затем в вашем компоненте:
this
.store$
.let(getCurrentUser)
.takeUntil(this.componentDestroyed$)
.do(_ => this.router.navigate(['/app']))
.subscribe();
В итоге
a user.selector.ts
:
export function getCurrentUser(store: Store<any>) {
return store$
.select(state => state.user)
.filter((user: IUser) => user.id !== null);
}
a component
:
private componentDestroyed$: new Subject<void>();
ngOnInit() {
this
.store$
.let(getCurrentUser)
.takeUntil(this.componentDestroyed$)
.do(_ => this.router.navigate(['/app']))
.subscribe();
}
ngOnDestroyed() {
this.componentDestroyed$.next();
this.componentDestroyed$.complete();
}
person
maxime1992
schedule
13.03.2017