Хотя общая идея «горячих и холодных» Observables кажется мне достаточно ясной, я запутался, работая над каким-то конкретным случаем.
Существует API-интерфейс флагов функций с клиентской библиотекой lib, обеспечивающий внутреннее кэширование и предоставляющий доступ на основе обратного вызова,Я хочу использовать этот клиент в Angular, создав службу, предоставляющую Observables с флагом возможностей. Поскольку мне нужна дополнительная конфигурация клиента и обеспечение обновления по требованию, я предложил следующий способ создания Observable:
public flag$(key: string) {
if (this.flagCache[key]) {
return this.flagCache[key];
}
const observableKeyFlag$ = this.commonConfig$.pipe(
map(config =>
this.observableFlag$(key, config)),
// shareReplay should ensure reuse of observableFlag$
// creation on subsequent re/connects
shareReplay({refCount: true, bufferSize: 1}),
switchMap(cachedObservableFlag$ =>
this.refresh$.pipe(
filter(refreshKey => refreshKey === key),
switchMap(() =>
cachedObservableFlag$))
);
return this.flagCache[key];
}
public refresh(key: string) {
this.refresh$.next(key);
}
Теперь ключевой вопрос: можно ли возвращать наблюдаемое, как указано выше (т.е. благодаря shareReply()
ИЛИ
this.flagCache[key] = new ReplySubject(1);
observableKeyFlag$.subscribe(this.flagCache[key]);
this.flagCache[key];
- в чем может быть разница между этими двумя вариантами?
- делает
shareReplay()
существенную разницу по сравнению сReplySubject
?
ПРИМЕЧАНИЕ: часть refresh$
немного сложнее, она содержит карту ключей для компонента, чтобы обновить их все сразу.
Не думайтевопрос использования вышеизложенного в Angular изменяет что-либо, кроме как для иллюстрации, предполагаемое использование:
<my-component>
<some-section *ngIf="flag$('feature1')">
Feature 1 content enabled
</some-section>
<some-section *ngIf="flag$('feature2')">
Feature 2 content enabled
</some-section>
</my-component>