import { Observable, OperatorFunction } from '../Observable'; /** * Returns an Observable that mirrors the source Observable, but will call a specified function when * the source terminates on complete or error. * * @param callback Function to be called when source terminates. * @return An Observable that mirrors the source, but will call the specified function on termination. */ export function finalize(callback: () => void): OperatorFunction { return (source: Observable): Observable => { return new Observable(subscriber => { let executed = false; const executeCallback = () => { if (!executed) { executed = true; callback(); } }; const subscription = source.subscribe({ next: value => { subscriber.next(value); }, error: err => { try { executeCallback(); } finally { subscriber.error(err); } }, complete: () => { try { executeCallback(); } finally { subscriber.complete(); } } }); return () => { try { subscription.unsubscribe(); } finally { executeCallback(); } }; }); }; }