Минулого тижня я відповів на запитання 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, тому що ви повинні подумати про те, як підписники повинні впливати на трубу чи не, наприклад (поділитися вашим спостережуваним чи ні). Але чим більше ви розділяєте свій код (тим більше ви зосереджуєтесь: що відбувається, коли), тим простіше підтримувати (перевірити, налагодити, оновити) свій код у майбутньому. Зважаючи на це, я завжди створюю єдине спостережуване джерело та одну підписку для будь-яких побічних ефектів у своєму коді. Якщо два або більше побічних ефектів, які я маю, викликані саме таким джерелом, який можна спостерігати, я поділяю свої спостережувані та підписуюсь на кожен побічний ефект окремо, оскільки він може мати різні життєві цикли.