concat

signature: concat(observables: ...*): Observable

Subscribe to observables in order as previous completes, emit values.


:bulb: You can think of concat like a line at a ATM, the next transaction
(subscription) cannot start until the previous completes!

:bulb: This operator can be used as either a static or instance method!

:bulb: If throughput, not order, is a primary concern, try merge
instead!


concat - 图4

Examples

(
example tests
)

Example 1: concat 2 basic observables

( StackBlitz |
jsBin |
jsFiddle )

  1. import { concat } from 'rxjs/operators';
  2. import { of } from 'rxjs/observable/of';
  3. //emits 1,2,3
  4. const sourceOne = of(1, 2, 3);
  5. //emits 4,5,6
  6. const sourceTwo = of(4, 5, 6);
  7. //emit values from sourceOne, when complete, subscribe to sourceTwo
  8. const example = sourceOne.pipe(concat(sourceTwo));
  9. //output: 1,2,3,4,5,6
  10. const subscribe = example.subscribe(val =>
  11. console.log('Example: Basic concat:', val)
  12. );
Example 2: concat as static method

( StackBlitz |
jsBin |
jsFiddle )

  1. import { of } from 'rxjs/observable/of';
  2. import { concat } from 'rxjs/observable/concat';
  3. //emits 1,2,3
  4. const sourceOne = of(1, 2, 3);
  5. //emits 4,5,6
  6. const sourceTwo = of(4, 5, 6);
  7. //used as static
  8. const example = concat(sourceOne, sourceTwo);
  9. //output: 1,2,3,4,5,6
  10. const subscribe = example.subscribe(val => console.log(val));
Example 3: concat with delayed source

( StackBlitz |
jsBin |
jsFiddle )

  1. import { delay, concat } from 'rxjs/operators';
  2. import { of } from 'rxjs/observable/of';
  3. //emits 1,2,3
  4. const sourceOne = of(1, 2, 3);
  5. //emits 4,5,6
  6. const sourceTwo = of(4, 5, 6);
  7. //delay 3 seconds then emit
  8. const sourceThree = sourceOne.pipe(delay(3000));
  9. //sourceTwo waits on sourceOne to complete before subscribing
  10. const example = sourceThree.pipe(concat(sourceTwo));
  11. //output: 1,2,3,4,5,6
  12. const subscribe = example.subscribe(val =>
  13. console.log('Example: Delayed source one:', val)
  14. );
Example 4: concat with source that does not complete

( StackBlitz |
jsBin |
jsFiddle )

  1. import { interval } from 'rxjs/observable/interval';
  2. import { of } from 'rxjs/observable/of';
  3. import { concat } from 'rxjs/observable/concat';
  4. //when source never completes, the subsequent observables never runs
  5. const source = concat(interval(1000), of('This', 'Never', 'Runs'));
  6. //outputs: 0,1,2,3,4....
  7. const subscribe = source.subscribe(val =>
  8. console.log(
  9. 'Example: Source never completes, second observable never runs:',
  10. val
  11. )
  12. );

Additional Resources


:file_folder: Source Code:
https://github.com/ReactiveX/rxjs/blob/master/src/internal/operators/concat.ts