반응형

조건 연산자란?

특정 조건에 맞는지 알려주는 boolean 값을 리턴해 특정 조건에 해당할 때 정해진 값을 발행하는 연산자다.

 

조건 연산자와 필터링 연산자와의 차이점

  • 필터링 연산자 - 소스 옵저버블에서 발행하는 값을 확인하는 연산자
  • 조건 연산자 - 이미 발행한 값이 아닌 소스 옵저버블의 특성에 따라서 조건 자체를 분기해야 할 때 사용하는 연산자

1. defaultIfEmpty 연산자

defaultIfEmpty 연산자는 소스 옵저버블이 empty 함수로 생성한 옵저버블일 때 인자로 설정한 기본값을 발행하는 연산자다.

defaultIfEmpty 연산자의 마블 다이어그램

empty 함수 (생성함수) - 소스 옵저버블이 아무 값도 발행하지 않고 완료하는 empty 옵저버블을 생성한다.

defaultIfEmpty 연산자 - empty 옵저버블을 생성할 때 기본값을 설정할 필요가 있을 때 사용

연산자 원형
defaultIfEmpty<T, R>(defaultValue: R = null): OperatorFunction<T, T | R>
/* defaultIfEmpty 연산자의 구현 코드 일부 */
_next(value) {
  this.isEmpty = false;
  this.destination.next(value);
}

_complete() {
  if (this.isEmpty) {
    this.destination.next(this.defaultValue);
  }
  this.destination.complete();
}

[코드 9-1] defaultIfEmpty 연산자의 구현 코드 일부

 

소스 옵저버블이 empty 옵저버블일 때는 기본값을 출력하고, empty 옵저버블이 아니라면 소스 옵저버블의 원래 동작을 처리한다.

/* defaultIfEmpty 연산자를 이용하는 empty 옵저버블 사용 예 */
const { range } = require('rxjs');
const { defaultIfEmpty } = require('rxjs/operators');

const getRangeObservable = count => range(1, count);

function subscribeWithDefaultIfEmpty(count) {
  getRangeObservable(count)
    .pipe(defaultIfEmpty('EMPTY'))
    .subscribe(value => console.log(`개수(count): ${count}, 값(value): ${value}`));
}

subscribeWithDefaultIfEmpty(0);
subscribeWithDefaultIfEmpty(3);

[코드 9-2] defaultIfEmpty 연산자를 이용하는 Empty 옵저버블 사용 예

 

실행 결과

개수(count): 0, 값(value): EMPTY
개수(count): 3, 값(value): 1
개수(count): 3, 값(value): 2
개수(count): 3, 값(value): 3

소스 옵저버블이 empty 옵저버블이면 complete 함수를 호출했을 때 기본값을 발행하고, 그렇지 않으면 소스 옵저버블의 원래 동작을 실행한다.


2. isEmpty 연산자

isEmpty 연산자는 true/false 를 값으로 발행해 소스 옵저버블이 empty 옵저버블인지 아닌지를 알려주고 구독 완료하는 연산자다.

 

isEmpty 연산자와 defaultIfEmpty 연산자의 차이점

  • defaultIfEmpty 연산자 - 소스 옵저버블이 empty 옵저버블이 아닐 때 소스 옵저버블의 원래 동작을 실행
  • isEmpty 연산자 - 소스 옵저버블이 empty 옵저버블인지 확인 후 true/false 값을 발행하고 구독을 완료

isEmpty 연산자의 마블 다이어그램

연산자 원형
isEmpty<T>(): OperatorFunction<T, boolean>
/* isEmpty 연산자의 사용 예 */
const { range } = require('rxjs');
const { isEmpty } = require('rxjs/operators');

const getRangeObservable = count => range(1, count);

function subscribeWithIsEmpty(count) {
  getRangeObservable(count)
    .pipe(isEmpty())
    .subscribe(value => console.log(`개수(count): ${count}, 값(value): ${value}`));
}

subscribeWithIsEmpty(0);
subscribeWithIsEmpty(3);

[코드 9-3] isEmpty 연산자의 사용 예

 

실행 결과

개수(count): 0, 값(value): true
개수(count): 3, 값(value): false

소스 옵저버블은 어떠한 값도 발행하지 않는다.


3. find 연산자

find 연산자는 인자로 사용하는 predicate 함수로 소스 옵저버블에서 발행하는 값 중 처음으로 함수 조건을 만족했을 때 true 를 리턴하는 값을 발행하고 구독을 완료하는 연산자다. 구독을 완료 할 때까지 조건을 만족하는 값이 없었다면 undefined 라는 값을 발행한다.

find 연산자의 마블 다이어그램

연산자 원형
find<T>(
       predicate: (value: T, index: number, source: Observable<T>) => boolean,
       thisArgs?: any
): MonoTypeOperatorFunction<T>

predicate 함수를 호출해 동작하는 중 에러가 발행하면 error 함수를 호출해 에러를 전달 받는다. 소스 옵저버블에서 에러가 발생해도 error 함수로 에러를 전파한다.

/* find 연산자의 사용 예 */
const { range } = require('rxjs');
const { find } = require('rxjs/operators');

const getRangeObservable = count => range(1, count);

function subscribeWithFindGreaterThan3(count) {
  getRangeObservable(count)
    .pipe(find(x => x > 3))
    .subscribe(value => console.log(`개수(count): ${count}, 값(value): ${value}`));
}

subscribeWithFindGreaterThan3(5);
subscribeWithFindGreaterThan3(1);

[코드 9-4] find 연산자의 사용 예

 

실행 결과

개수(count): 5, 값(value): 4
개수(count): 1, 값(value): undefined
반응형

'RxJS' 카테고리의 다른 글

11장. 서브젝트 요약  (0) 2024.08.06
10장. 에러 처리 요약  (0) 2024.08.05
8장. 유틸리티 연산자 요약  (0) 2024.08.02
7장. 수학 및 결합 연산자 요약  (0) 2024.08.02
6장. 조합 연산자 요약  (0) 2024.08.01

+ Recent posts