Rx

[Rxjs] combineAll

bugtype 2020. 1. 11. 15:30

https://www.learnrxjs.io/operators/combination/combineall.html

[

combineAll · learn-rxjs

No results matching ""

www.learnrxjs.io

](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