RxJS finalize

agnusdei·2023년 7월 6일
0

finalize는 RxJS에서 제공하는 옵저버블의 라이프사이클 중 하나로, 옵저버블이 완료되거나 에러가 발생했을 때 항상 실행되는 콜백 함수를 등록하는 연산자입니다. finalize를 사용하면 옵저버블의 마지막 단계에서 어떤 작업을 수행하고자 할 때 유용하게 활용할 수 있습니다.

finalize 연산자는 다음과 같은 구조로 사용됩니다:

import { finalize } from 'rxjs/operators';

observable$.pipe(
  // 다른 연산자들...
  finalize(() => {
    // 옵저버블이 완료되거나 에러가 발생했을 때 실행되는 콜백 함수
    // 수행할 작업을 여기에 작성
  })
).subscribe();

옵저버블이 완료되었다는 말은 옵저버블이 모든 값을 방출하고 더 이상 값을 방출하지 않는 상태를 의미합니다. 즉, 옵저버블의 데이터 스트림이 종료되었다는 것을 의미합니다.

옵저버블에서 값을 방출하다가 모든 값이 방출되고 더 이상 값이 없을 때, complete 신호를 발행하고 옵저버블은 완료됩니다. 이는 옵저버에게 "더 이상 값을 기다리지 않아도 된다"는 신호를 전달하는 것이며, 옵저버는 이를 통해 작업을 마무리하거나 정리 작업을 수행할 수 있습니다.

완료 신호(complete signal)는 옵저버에게 옵저버블이 성공적으로 완료되었음을 알리기 위해 사용됩니다. 이는 오류가 발생하지 않고 옵저버블이 정상적으로 종료된 경우에 해당합니다. 완료 신호 이후에는 추가적인 값이나 완료 신호를 방출하지 않습니다.

옵저버블이 완료되었다는 말은 옵저버블 구독이 종료되었다는 의미와 같을 수 있습니다. 완료된 옵저버블에 대한 구독은 더 이상 값을 받지 않으며, 옵저버블과 관련된 자원 정리 및 후속 작업을 수행할 수 있습니다.

위의 코드 예시에서 observable$는 옵저버블을 나타내는 변수입니다. finalize 연산자는 pipe 함수 내에서 다른 연산자들과 함께 사용됩니다. finalize 연산자의 파라미터로는 실행하고자 하는 콜백 함수를 전달합니다. 이 콜백 함수는 옵저버블이 완료되거나 에러가 발생했을 때 항상 실행됩니다.

finalize 연산자를 사용하면 주로 옵저버블을 구독을 해제하거나 정리 작업을 수행하는 등의 마무리 작업을 할 수 있습니다. 예를 들어, 파일을 열고 작업을 수행한 후에는 finalize를 사용하여 파일을 닫는 작업을 수행할 수 있습니다.

다음은 finalize 연산자를 사용한 간단한 코드 예시입니다:

import { interval } from 'rxjs';
import { finalize, take } from 'rxjs/operators';

const observable$ = interval(1000).pipe(
  take(5),
  finalize(() => {
    console.log('Observable completed');
  })
);

observable$.subscribe(
  value => console.log(value),
  error => console.error(error),
  () => console.log('Subscription completed')
);

위의 코드에서 interval 함수로 생성된 옵저버블은 1초마다 값을 방출하는 옵저버블입니다. take(5) 연산자로 옵저버블이 5개의 값을 방출한 후에 완료됩니다. finalize 연산자로는 완료 시 "Observable completed" 메시지를 출력하는 콜백 함수를 등록합니다.

실행 결과는 다음과 같습니다:

0
1
2
3
4
Observable completed
Subscription completed

마지막으로, finalize 연산자는 항상 실행되는 콜백 함수이므로 주의해야 할 점은 콜백 함수 내에서 장시간 동작하는 작업을 수행하면 다음

옵저버블이나 구독체인에 영향을 줄 수 있다는 점입니다. 장기간 동작하는 작업이 필요한 경우에는 finalize 내에서 비동기 작업을 실행하거나 finalize을 사용하는 것보다는 다른 방법을 고려해야 합니다.

0개의 댓글