При работе с Observables всегда есть грань, где вы не можете пройти дальше Observable
. В Angular их можно передать в шаблон представления, подписавшись на них через канал | async
. Или, в вашем случае, в качестве возвращаемого значения canActivate
. Поэтому очень удобно использовать Observables в вашем сервисе.
В вашем сервисе, если вы хотите кэшировать результаты, вы можете сохранить их, используя BehaviourSubject
, а затем передать их как наблюдаемые. Или вы можете создать наблюдаемый с оператором shareReplay
и использовать его снова. Или просто вы можете просто сохранить их и вернуть их, используя функцию of
из 'rxjs'
. Я собираюсь проиллюстрировать последний вариант.
@Injectable
export class ToggleService {
private _toggles: string[];
private _hasToggles: boolean;
getToggles(refresh?: boolean) {
if (!refresh || !this.toggles) {
return this.http.get('...').pipe(
tap((toggles) => {
this._toggles = toggles;
});
);
} else {
return of(this._toggles);
}
}
Из isOn
вы также можете вернуть Observable
- boolean
типа. Таким образом, вы можете пройти как можно дальше.
isOn(toggle): Observable<boolean> {
return this.getToggles().pipe(
map(toggles => toggles.includes(toggle))
)
}
canActivate
становится очень простым:
canActivate(): Observable<boolean> {
return this.toggleService.isOn('my toggle');
}
Angular подписывается на возвращаемую наблюдаемую. Нет необходимости проверять, были ли переключатели уже загружены - об этом уже позаботится служба.