2016-10-13 5 views
0

나는 RxJs와 Observables에 일반적으로 접근하고있다. 나는 종종 "takeUntil()"을 활용하여 "자체 포함"Observable을 만들 수 있다는 생각을 파악했습니다.RxJs : 탐색 할 때 Observables 구독을 취소하는 것이 좋습니다.

한 온라인 과정에서 나는 선생님이 "나는 항상 takeUntil()을 사용하여 이벤트의 끝 흐름을 만들기 때문에 10 년 동안 아무 것도받지 않았다."라고 말하고 있습니다. 이것은 그의 예입니다 :

var getElementDrags = elmt => elmt 
    .mouseDowns.map(() => document.mouseMoves.takeUntil(document.mouseUps)) 
    .concatAll(); 

"내부"Observables에는 매우 유용합니다. 그러나 "mousedown"에서 관찰 할 수있는 하나의 외부는 결코 실제로 구독을 취소하지 않습니다 ...

우리는 여전히 이들로부터 구독을 취소해야합니까? 사용자가 페이지를 떠날 때 탈퇴 또는 처분하는 것이 여전히 좋은 습관입니까?

+0

코드에서 구독하지 않으므로 구독을 취소 할 수 없습니다. –

+0

@torazaburo : 코드는 약간의 "의사"입니다 -하지만 "elmt.mouseDowns"Observable을 얻기위한 구독이 있다고 생각합니다 ... – Wolfgang

답변

0

예제에 가입하지 않으 셨습니다. RxJS는 게으르다. 결과 관찰에 가입 할 때만 mouseDowns에 가입해야하며, 물론 관찰 할 때 밑줄을 긋는 관찰 기록에서 구독을 취소하게됩니다. 결과 관찰에서 탈퇴.

일반적으로 - 네가 무언가를 구독 할 때 구독을 취소하는 것이 좋습니다 ... 그러나 RxJS를 사용하는 동안 일반적으로 수동으로 구독 할 필요가 없으며 필요할 때 구독 할 필요가 있습니다 앱이 실행되는 동안 (구독을 취소 할 필요가 없음)

유일한 예외는 - 당신이 자신의 연산자를 개발, 또는 외부 뭔가에 연결할 때 ...


예를 들어 당신이 구성 요소를 반응 마운트에 대한 업데이트에 가입에 대한 라이프 사이클 뒷무릎을 사용하는 경우와 마운트를 해제 할 때 구독을 취소하십시오. 여기

은 그 목적을 https://github.com/zxbodya/rx-react-container 내 도서관 - 그것은 관찰 가능한, 주제를 결합하고 렌더링 가능한 항목과 새 관찰에 구성 요소를 반응 ... 결과에서

const app$ = createContainer(
    App, // react component 
    {totalCount$}, // observables with data 
    {plusOne$, minusOne$} // observers for user actions 
); 

const appElement = document.getElementById('app'); 
const appSubscription = app$.forEach(renderApp=>render(renderApp(), appElement)); 

당신이 전체 응용 프로그램 관리 할 수있는 하나 개의 구독이 (appSubscription)이며 앱을 실행하는 동안 사용되므로 탈퇴 할 필요가 없습니다.

내비게이션 할 때 라우팅 및 수신 거부에 관한 동일한 사항 - 간소화 된 경우 각 위치에 대해 관찰 가능 (위의 app$과 같은)을 반환 할 수있는 범위 내에서 단지 flatMapLatest을 관찰 할 수 있습니다 ... 그리고 다시 수동으로 구독/탈퇴 - flatMapLatest가 내부적으로 수행합니다.