Я бы сделал это следующим образом:
export class EntityStorage {
private setEntities = new Subject<[string, any[]]>();
private entitiesStore = new ReplaySubject<Map<string, any[]>>(1)
constructor(private apiService: ApiService) {
this.setEntities.pipe(
scan((entityMap, [key, entities]) => {
entityMap.set(key, entities);
return entityMap;
}, new Map<string, any[]>())
).subscribe(this.entitiesStore)
}
loadAllEntity(key: string, httpParams: HttpParams): void {
this.apiService.getEntities(key, httpParams).subscribe(
(entities) => {
this.setEntities.next([key, entities]);
},
(error) => {
console.error(error);
},
() => {}
);
}
getStoreWithKey(key: string): any[] {
return this.entitiesStore.pipe(
map(entityMap => entityMap.get(key)),
filter(entity => !!entity), // optional, prevent emissions until key loaded.
distinctUntilChanged() // optional. prevents subscribers from receiving updates about different keys.
);
}
}
в основном вы используете частный локальный субъект для запуска обновлений в теме воспроизведения вашей карты и используете сканирование для его обновления.
если вы хотите, можете даже переместить загрузку в поток, что даст более точный контроль над загрузкой, ie, не вызывая загрузку объекта дважды для одного и того же ключа (если это возможно в вашем приложении), дайте мне знать, если это необходимо .