https://www.learnrxjs.io/operators/combination/combineall.html
[
combineAll · learn-rxjs
No results matching ""
](https://www.learnrxjs.io/operators/combination/combineall.html)
import { take, map, combineAll } from 'rxjs/operators';
import { interval } from 'rxjs';
// emit every 1s, take 2
const source$ = interval(1000).pipe(take(2));
// map each emitted value from source to interval observable that takes 5 values
const example$ = source$.pipe(
map(val => interval(1000).pipe(map(i => `Result (${val}): ${i}`), take(5)))
);
/*
2 values from source will map to 2 (inner) interval observables that emit every 1s
combineAll uses combineLatest strategy, emitting the last value from each
whenever either observable emits a value
*/
example$.pipe(combineAll())
/*
output:
["Result (0): 0", "Result (1): 0"]
["Result (0): 1", "Result (1): 0"]
["Result (0): 1", "Result (1): 1"]
["Result (0): 2", "Result (1): 1"]
["Result (0): 2", "Result (1): 2"]
["Result (0): 3", "Result (1): 2"]
["Result (0): 3", "Result (1): 3"]
["Result (0): 4", "Result (1): 3"]
["Result (0): 4", "Result (1): 4"]
*/
.subscribe(console.log);
const source$ = interval(1000).pipe(take(2));
- 1초때마다 emit을 하고, 2번 방출할 시 그만 내보낸다.
const example$ = source$.pipe(
map(val => interval(1000).pipe(map(i => Result (${val}): ${i}
), take(5)))
);
- source에서 내보낼때마다 interval을 총 5번 방출한다.
- stream이 2개 생겼고 stream마다 5번씩 호출한다.
example$.pipe(combineAll())
- 모든 stream에서 emit을 해야지 emit한다.
- 예를 들어서 2번째 stream에서 1초뒤가 아니라 10초뒤에 emit을 하면 10초뒤에 emit 하게 된다.
주의 해야할 점.
소스내에 처음 emit할때 inner에서 마지막꺼만 내보내게 된다. 만약
const source$ = interval(1000).pipe(take(2));
위 소스에서 2가 아니라 100이면 99개는 emit되지 않는다. 주의하길 !
'Rx' 카테고리의 다른 글
[Rx] combineLatest Operator (0) | 2019.11.24 |
---|---|
[Rx] sequenceEqual operator (0) | 2019.11.24 |