| import { Operator } from '../Operator'; |
| import { Subscriber } from '../Subscriber'; |
| import { Subscription } from '../Subscription'; |
| import { Observable } from '../Observable'; |
| import { MonoTypeOperatorFunction, TeardownLogic } from '../types'; |
| |
| /** |
| * Returns an Observable that mirrors the source Observable, but will call a specified function when |
| * the source terminates on complete or error. |
| * @param {function} callback Function to be called when source terminates. |
| * @return {Observable} An Observable that mirrors the source, but will call the specified function on termination. |
| * @method finally |
| * @owner Observable |
| */ |
| export function finalize<T>(callback: () => void): MonoTypeOperatorFunction<T> { |
| return (source: Observable<T>) => source.lift(new FinallyOperator(callback)); |
| } |
| |
| class FinallyOperator<T> implements Operator<T, T> { |
| constructor(private callback: () => void) { |
| } |
| |
| call(subscriber: Subscriber<T>, source: any): TeardownLogic { |
| return source.subscribe(new FinallySubscriber(subscriber, this.callback)); |
| } |
| } |
| |
| /** |
| * We need this JSDoc comment for affecting ESDoc. |
| * @ignore |
| * @extends {Ignored} |
| */ |
| class FinallySubscriber<T> extends Subscriber<T> { |
| constructor(destination: Subscriber<T>, callback: () => void) { |
| super(destination); |
| this.add(new Subscription(callback)); |
| } |
| } |