diff --git a/src/observable/FromEventPatternObservable.ts b/src/observable/FromEventPatternObservable.ts index 3861ca38dc..5a1f5c5fde 100644 --- a/src/observable/FromEventPatternObservable.ts +++ b/src/observable/FromEventPatternObservable.ts @@ -45,9 +45,10 @@ export class FromEventPatternObservable extends Observable { * @param {function(handler: Function): any} addHandler A function that takes * a `handler` function as argument and attaches it somehow to the actual * source of events. - * @param {function(handler: Function): void} removeHandler A function that + * @param {function(handler: Function, signal?: any): void} removeHandler A function that * takes a `handler` function as argument and removes it in case it was - * previously attached using `addHandler`. + * previously attached using `addHandler`. if addHandler returns signal to teardown when remove, + * removeHandler function will forward it. * @param {function(...args: any): T} [selector] An optional function to * post-process results. It takes the arguments from the event handler and * should return a single value. @@ -57,13 +58,13 @@ export class FromEventPatternObservable extends Observable { * @owner Observable */ static create(addHandler: (handler: Function) => any, - removeHandler: (handler: Function) => void, + removeHandler: (handler: Function, signal?: any) => void, selector?: (...args: Array) => T) { return new FromEventPatternObservable(addHandler, removeHandler, selector); } constructor(private addHandler: (handler: Function) => any, - private removeHandler: (handler: Function) => void, + private removeHandler: (handler: Function, signal?: any) => void, private selector?: (...args: Array) => T) { super(); } @@ -75,10 +76,11 @@ export class FromEventPatternObservable extends Observable { this._callSelector(subscriber, args); } : function(e: any) { subscriber.next(e); }; - this._callAddHandler(handler, subscriber); + const retValue = this._callAddHandler(handler, subscriber); + subscriber.add(new Subscription(() => { //TODO: determine whether or not to forward to error handler - removeHandler(handler); + removeHandler(handler, retValue) ; })); } @@ -92,9 +94,9 @@ export class FromEventPatternObservable extends Observable { } } - private _callAddHandler(handler: (e: any) => void, errorSubscriber: Subscriber): void { + private _callAddHandler(handler: (e: any) => void, errorSubscriber: Subscriber): any | null { try { - this.addHandler(handler); + return this.addHandler(handler) || null; } catch (e) { errorSubscriber.error(e);