Rx JS является ценным ресурсом для управления асинхронными операциями и должен использоваться для упрощения вашего кода (включая сокращение количества подписок), где это возможно. Точно так же за наблюдаемой не должна автоматически следовать подписка на эту наблюдаемую, если Rx JS предоставляет решение, которое может уменьшить общее количество подписок в вашем приложении.
Однако в некоторых ситуациях это может полезно создать подписку, которая не является строго «необходимой»:
Пример исключения - повторное использование наблюдаемых в одном шаблоне
Глядя на ваш первый пример:
// Component:
this.value$ = this.store$.pipe(select(selectValue));
// Template:
<div>{{value$ | async}}</div>
Если значение $ используется только один раз в шаблоне, я бы воспользовался каналом asyn c и его преимуществами для экономии кода и автоматической отмены подписки c. Однако согласно этому ответу следует избегать нескольких ссылок на одну и ту же переменную asyn c в шаблоне, например:
// It works, but don't do this...
<ul *ngIf="value$ | async">
<li *ngFor="let val of value$ | async">{{val}}</li>
</ul>
В этой ситуации вместо этого я бы создал отдельную подписаться и использовать это, чтобы обновить переменную non-asyn c в моем компоненте:
// Component
valueSub: Subscription;
value: number[];
ngOnInit() {
this.valueSub = this.store$.pipe(select(selectValue)).subscribe(response => this.value = response);
}
ngOnDestroy() {
this.valueSub.unsubscribe();
}
// Template
<ul *ngIf="value">
<li *ngFor="let val of value">{{val}}</li>
</ul>
Технически, можно достичь того же результата без valueSub
, но требования приложения означают, что это правильный выбор.
Принимая во внимание роль и продолжительность жизни наблюдаемого, прежде чем принимать решение о подписке
Если две или более наблюдаемых могут использоваться только в совокупности, соответствующие Операторы Rx JS должны использоваться для объединения их в одну подписку.
Точно так же, если first () используется для фильтрации всего, кроме первого выброса наблюдаемой, я думаю, что есть большая причина быть экономной с вашим кодом и избегать «лишних» подписки, чем для наблюдаемой, которая играет постоянную роль в сеансе.
Если какая-либо из отдельных наблюдаемых полезна независимо от других, гибкость и ясность отдельной подписки (подписок) могут стоить рассмотреть. Но согласно моему первоначальному утверждению, подписка не должна создаваться автоматически для каждого наблюдаемого, если только для этого нет явной причины.
Относительно отписок:
A точка против дополнительных подписок заключается в том, что требуется больше отписок . Как вы сказали, мы хотели бы предположить, что все необходимые отписки применяются на Дестрой, но реальная жизнь не всегда так гладко! Опять же, Rx JS предоставляет полезные инструменты (например, first () ) для оптимизации этого процесса, что упрощает код и уменьшает вероятность утечек памяти. Эта статья содержит соответствующую дополнительную информацию и примеры, которые могут иметь значение.
Личные предпочтения / многословие по сравнению с краткостью:
Примите ваши собственные предпочтения во внимание. Я не хочу отклоняться от общей дискуссии о многословности кода, но цель должна состоять в том, чтобы найти правильный баланс между слишком большим «шумом» и чрезмерным шифрованием вашего кода c. Это может стоить посмотреть .