У меня есть одна служба, которая возвращает один Observable. Теперь я ищу правильный/самый эффективный способ получить несколько результатов от этого Observable без написания слишком большого количества кода.
MyService
возвращаетObservable<Array<Foo>>
MyComponent
вызываетmyService.getFoos()
и должен вывести первые 5 элементов из массива, а также общую длину массива и количество не показанных элементов.
Вот мой текущий код:
@Injectable()
export class MyService {
foos = new BehaviorSubject<Array<Foo>>([]);
getFoos() {
return this.foos.asObservable();
}
}
@Component({
template: `
Total: {{ totalCount | async }}
Omitted: {{ (totalCount | async) - (maxFiveItems | async).length }}
<div *ngFor="let item of maxFiveItems | async">
{{item.bar}}
</div>
`
})
export class MyComponent {
totalCount: Observable<number>;
maxFiveItems: Observable<Array<Foo>>;
constructor(myService:MyService) {
this.totalCount = myService.getFoos()
.map(arr => arr.length);
this.maxFiveItems = myService.getFoos()
.map(arr => arr.slice(0, 5));
}
}
Результат выглядит нормально, но я использую канал async
4 раза. Что (насколько мне известно) приведет к 4 подпискам. Это вообще не должно быть необходимо, я думаю (?)
Конечно, я мог бы вручную подписаться на constructor
из MyComponent
и жить без async
каналов. Но тогда я должен сам позаботиться об отписке.
Есть ли другой способ справиться с этим?