Горячие и холодные наблюдаемые при предоставлении выделенного доступа API для использования компонентами Angular - PullRequest
0 голосов
/ 03 октября 2019

Хотя общая идея «горячих и холодных» 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>

1 Ответ

0 голосов
/ 03 октября 2019

Вы задали несколько вопросов.

Итак, я постараюсь ответить на некоторые из них

Да, все в порядке, чтобы вернуть наблюдаемое.

Я стараюсь всегда возвращатьнаблюдаемым. Таким образом, если я возвращаю наблюдаемую информацию, я могу использовать асинхронный канал, используя асинхронный канал, мне не нужно беспокоиться о подписке и отписке на ngOnDestroy.

Теперь оба сценария приемлемы,но теперь это касается читабельности вашего кода и стиля / предпочтений кода

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...