На прошлой неделе я ответил на вопрос RxJS, где я вступил в дискуссию с другим членом сообщества на тему : «Должен ли я создать подписку для каждого конкретного побочного эффекта или я должен попытаться минимизировать подписки в целом?» Я хочу знать, какую методологию использовать с точки зрения полного реактивного подхода к применению или когда переключаться с одного на другой. Это поможет мне и, возможно, другим избежать ненужных дискуссий.
Информация о настройке
- Все примеры в TypeScript
- Чтобы лучше сосредоточиться на вопросе, не использовать жизненные циклы / конструкторы для подписок и держать в рамках не связанными
- Представьте себе: подписки добавляются в init конструктора / жизненного цикла
- Представьте себе: отмена подписки осуществляется в жизненном цикле уничтожения
Что такое побочный эффект (угловой образец)
- Обновление / ввод в пользовательском интерфейсе (например
value$ | async
) - Выход / восходящий поток компонента (например
@Output event = event$
) - Взаимодействие между различными службами в разных иерархиях
Примерный вариант использования:
- Две функции:
foo: () => void; bar: (arg: any) => void
- Две исходные наблюдаемые:
http$: Observable<any>; click$: Observable<void>
foo
вызывается после того, какhttp$
выпустил и не нуждается в значенииbar
вызывается послеclick$
эмиссии, но нуждается в текущем значенииhttp$
Случай: создать подписку для каждого конкретного побочного эффекта
const foo$ = http$.pipe(
mapTo(void 0)
);
const bar$ = http$.pipe(
switchMap(httpValue => click$.pipe(
mapTo(httpValue)
)
);
foo$.subscribe(foo);
bar$.subscribe(bar);
Дело: Минимизировать подписки в целом
http$.pipe(
tap(() => foo()),
switchMap(httpValue => click$.pipe(
mapTo(httpValue )
)
).subscribe(bar);
Мое собственное мнение вкратце
Я могу понять тот факт, что подписки вначале усложняют Rx-ландшафты, потому что вы должны думать о том, как подписчики, например, должны влиять на канал или нет (поделиться своими наблюдаемыми или нет). Но чем больше вы разделяете свой код (чем больше вы сосредотачиваетесь: что происходит, когда), тем легче поддерживать (тестировать, отлаживать, обновлять) ваш код в будущем. Имея это в виду, я всегда создаю один наблюдаемый источник и одну подписку для любого побочного эффекта в моем коде. Если два или более моих побочных эффектов вызваны одним и тем же наблюдаемым источником, то я делюсь своим наблюдаемым и подписываюсь на каждый побочный эффект индивидуально, потому что он может иметь разные жизненные циклы.