Вы используете только свой BehaviorSubject, но ваш получатель не полагается на него. Ваша текущая услуга полностью синхронизирована с потребителями, и «да», то, как вы запрограммировали ее сейчас, imageUrlsSubject
на самом деле не нужно.
Истинное преимущество использования субъекта заключается в том, что вы можете предоставьте это как наблюдаемый в другие места! Вместо того, чтобы люди могли получить доступ только к текущему значению imageUrls
, они могут получить доступ к текущим и всем будущим значениям imageUrls! Им дается поток вместо снимка.
Затем у вас есть 3 варианта дизайна:
- Всегда возвращать наблюдаемое. Люди должны передать его и
take(1)
, если им нужен снимок. - Всегда возвращать наблюдаемую, но добавить сокращенную функцию
snap
, которая возвращает текущее значение. - Всегда возвращать снимок ( как в настоящее время в вашем коде) и добавьте функцию
watch
, которая возвращает Observable.
Я бы go еще дальше и сказал бы, что вам не следует хранить отдельное свойство imageUrls
и вместо этого полагайтесь на imageUrlsSubject.value
(только для объектов поведения). Я только рекомендую это, чтобы вы A) с меньшей вероятностью забыли subject.next(newValue)
, когда вы измените свое значение B), чтобы снова напомнить вам, что вы должны использовать свой предмет; p
Вот адаптированный пример, который поддерживает синхронное поведение по умолчанию get
и добавляет асинхронный watch
.
@Injectable({
providedIn: 'root'
})
export class DataService {
public imageUrlsSubject = new BehaviorSubject(new Map<number, string>());
public size(): number {
return this.imageUrlsSubject.value.size;
}
public set(id: number, url: string): void {
this.imageUrlsSubject.value.set(id,url);
this.imageUrlsSubject.next(this.imageUrlsSubject.value);
}
public get(id: number): string {
return this.imageUrlsSubject.value.get(id);
}
public has(id: number): boolean {
return this.imageUrlsSubject.value.has(id);
}
public watch(): Observable<Map<number, string>> {
return this.imageUrlsSubject.asObservable();
}
}
Теперь в другом месте вашего кода вы можете подписаться на любые изменения в вашей карте, вы можете передать его, передать труба / наблюдаемая вокруг, ...