iif(condition: () => boolean, trueResult: SubscribebaleOrPromise = EMPTY, falseResult: SubscribableOrPromise = EMPTY): Observable

 

첫 번째 인자로 주어진 predicate fucntion을 실행하여, true일 경우 두 번째 인자가 반환하는 Subscribable 또는 Promise를, false일 경우 세 번째 인자가 반환하는 Subscribable 또는 Promise를 구독한다.

 

iff 사용 시 주의할 점이 있다.

 

아래 코드를 실행한다고 하면,

...
const source = of('Some value');
const whenTrue => (v) => {console.log('Do you expect it to be executed only if true?') return of('true!')};
const whenFalse => (v) => {console.log('Do you expect it to be executed only if false?') return of('false!')};

source.pipe(
	mergeMap(v => 
    	iif(_ => v === 'Some value',
			whenTrue(v),
			whenFalse(v)
        ))
).subscribe(console.log);

 

source의 값은 'Some value' 이기에, 콘솔에는 다음과 같이 찍힐 거라고 생각할 수 있다:

Do you expect it to be executed only if true?
true!

 

실행 결과는 다음과 같다:

Do you expect it to be executed only if true?
Do you expect it to be executed only if false?
true!

 

 

whenTrue, whenFalse는 iff의 실행 시점에 인자 evaluation시에 실행되고, predicate function의 결과가 true이니 'true!'를 출력했다.

 

아주 당연한 결과이지만, iif 를 분기 동작에 사용하려고 할 때 쉽게 실수할 수 있는 부분인 것 같아 굳이 정리해둔다.

+ Recent posts