티스토리 뷰

switchMap

파라미터: 소스 옵저버블의 각 아이템에 적용될 함수. (e.g. of(1,2,3) 이면 1과 2와 3에 각각 적용될 함수) 이 함수는 옵저버블을 리턴한다. 즉 2차원으로 중첩된 옵저버블이 원래라면 생기게 된다.

이걸 간단히 배열로 생각하자면 [1,2,3].map($0 => [$0 * 2]) 이런 식으로 생각할 수 있다. 즉 map의 소스가 되는 아이도 배열이고, map 메서드의 파라미터로 주어지는 함수도 배열을 리턴하면, 결과는 2차원 배열이 되는 것처럼 생각하면 된다. (배열을 옵저버블로 치환해서 생각하면 됨) rx에서 모든 연산자는 옵저버블 인스턴스를 리턴하도록 되어있기 때문에, 옵저버블에 연산자를 매핑하면 원래라면 중첩된 옵저버블이 생기게 되는 것이다.

하지만 중첩된 옵저버블은 reactive programming에서 지향하는 바가 아니므로 평탄화(flatten)를 해주는 기능이 필요하다. 결과값을 받아보는 옵저버든, 체이닝되는 연산자든, 인풋 옵저버블의 계층을 신경쓰지 않고(캡슐화) 값을 처리할 수 있어야 하므로 옵저버블은 평탄화해야 한다.

그래서 switchMap, concatMap, mergeMap 등 rx의 주요 매핑 연산자는 중첩된 옵저버블을 flatten하여 리턴하는 기능을 기본적으로 탑재하고 있다.

그리고 switchMap의 경우 이것을 flatten하면서도, 가장 최근에 만들어진(가장 최근에 함수로부터 리턴된) inner 옵저버블의 값을 뱉는다. 좀 더 정확히 말하면 새로운 inner 옵저버블이 발생되면, 스위치맵은 그 전의 inner 옵저버블로부터 발생하던 값을 중단시키고(구독을 취소하고), 새로운 inner 옵저버블로부터 생기는 값을 뱉는다.

concatMap

switchMap처럼 옵저버블을 평탄화 하되, 다음 inner 옵저버블은 그 전의 inner 옵저버블이 끝나고 나서야 합쳐진다. 즉 최신 inner 옵저버블이 생기더라도, 그 전의 inner 옵저버블의 값 방출이 완료되고 나서야 시작한다.

이 경우 앞에 있는 옵저버블이 무한히 값을 방출한다면 뒤에 이어지는 옵저버블은 아예 값을 방출할 수 없을 수 있다. 이때는 take 연산자처럼 스트림을 유한하게 만들 수 있는 연산자를 사용해서 방지할 수 있다.

mergeMap

mergeMap 역시 옵저버블을 평탄화하되, inner 옵저버블에서 값을 방출할 때마다 결과 옵저버블을 방출한다. concatMap의 경우 순서가 유지되어서, 전의 옵저버블의 방출이 끝나야 그 다음 옵저버블의 값 방출을 시작했지만 mergeMap은 옵저버블의 순서와는 관계없이 값이 방출되는 순서에 따라서 interleaving하게 값을 방출한다.

e.g. A라는 옵저버블이 방출하는 값이 A1, A2, A3 이고 B라는 옵저버블이 방출하는 값이 B1, B2, B3이면 concatMap은 무조건 A1, A2, A3, B1, B2, B3 이렇게 방출하고, mergeMap은 A1, B1, A2, B2, B3, A3 이런 식으로 옵저버블 A, B 순서와 관계없이 먼저 나온 값을 먼저 내보낸다.

combineLatest

combine -> 옵저버블들을 조합해서 새로운 옵저버블을 리턴한다.
Latest -> 각 인풋 옵저버블에서 최신 값들이 갱신될 때마다 그 최신 값들을 조합해서 새로 계산한 값을 결과 옵저버블로 방출함.

ref

https://rxjs-dev.firebaseapp.com/
각 목차 선택하면 해당 페이지 이동.

 

RxJS

 

rxjs-dev.firebaseapp.com

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함