지난주에 RxJS 질문에 답변 했는데 다른 커뮤니티 멤버와 "모든 특정 부작용에 대해 구독을 작성해야합니까? 아니면 일반적으로 구독을 최소화해야합니까?" 완전한 반응 형 응용 프로그램 접근 방식 또는 서로 전환하는 시점에서 사용할 방법을 알고 싶습니다. 이것은 저와 다른 사람들이 불쾌한 토론을 피하는 데 도움이 될 것입니다.
설치 정보
- 모든 예제는 TypeScript에 있습니다.
- 질문에 더 초점을 맞추려면 구독에 수명주기 / 생성자를 사용하지 않고 프레임 워크를 관련이 없습니다.
- 상상해보십시오. 구독은 생성자 / 라이프 사이클 초기화에 추가됩니다.
- 상상 : 구독 취소는 수명주기에서 완료됩니다.
부작용이란 무엇입니까 (각도 샘플)
- 업데이트 / UI에 입력 (예
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 환경을 더 복잡하게 만든다는 사실을 이해할 수 있습니다. 가입자가 파이프에 영향을 미치거나 예를 들어 관찰 할 수 있는지 여부를 고려해야하기 때문입니다. 그러나 코드를 더 많이 분리할수록 (포커스가 많을수록 발생하는시기) 나중에 코드를 유지 관리 (테스트, 디버그, 업데이트)하기가 쉬워집니다. 이를 염두에두고 항상 관찰 가능한 단일 소스와 코드의 부작용에 대한 단일 구독을 만듭니다. 두 개 이상의 부작용이 정확히 동일한 소스 관찰 가능 항목에 의해 트리거되는 경우 관찰 가능 항목을 공유하고 각 부작용을 개별적으로 구독합니다. 수명주기가 다를 수 있기 때문입니다.