frontend/.pnpm-store/v3/files/d9/0f2a6d055aed99ba8aabd718bf8110dae671735f09e9a61cfe72c76897b9a9cd5f3426edbea22e78657e2d2e9950812f26c4eb0e152beb35c4918e6a6d16e3

76 lines
2.2 KiB
Plaintext

import { MonoTypeOperatorFunction } from '../types';
import { operate } from '../util/lift';
/**
* Returns an Observable that mirrors the source Observable, but will call a specified function when
* the source terminates on complete or error.
* The specified function will also be called when the subscriber explicitly unsubscribes.
*
* ## Examples
*
* Execute callback function when the observable completes
*
* ```ts
* import { interval, take, finalize } from 'rxjs';
*
* // emit value in sequence every 1 second
* const source = interval(1000);
* const example = source.pipe(
* take(5), //take only the first 5 values
* finalize(() => console.log('Sequence complete')) // Execute when the observable completes
* );
* const subscribe = example.subscribe(val => console.log(val));
*
* // results:
* // 0
* // 1
* // 2
* // 3
* // 4
* // 'Sequence complete'
* ```
*
* Execute callback function when the subscriber explicitly unsubscribes
*
* ```ts
* import { interval, finalize, tap, noop, timer } from 'rxjs';
*
* const source = interval(100).pipe(
* finalize(() => console.log('[finalize] Called')),
* tap({
* next: () => console.log('[next] Called'),
* error: () => console.log('[error] Not called'),
* complete: () => console.log('[tap complete] Not called')
* })
* );
*
* const sub = source.subscribe({
* next: x => console.log(x),
* error: noop,
* complete: () => console.log('[complete] Not called')
* });
*
* timer(150).subscribe(() => sub.unsubscribe());
*
* // results:
* // '[next] Called'
* // 0
* // '[finalize] Called'
* ```
*
* @param {function} callback Function to be called when source terminates.
* @return A function that returns an Observable that mirrors the source, but
* will call the specified function on termination.
*/
export function finalize<T>(callback: () => void): MonoTypeOperatorFunction<T> {
return operate((source, subscriber) => {
// TODO: This try/finally was only added for `useDeprecatedSynchronousErrorHandling`.
// REMOVE THIS WHEN THAT HOT GARBAGE IS REMOVED IN V8.
try {
source.subscribe(subscriber);
} finally {
subscriber.add(callback);
}
});
}