diff --git a/spec/observables/fromEvent-spec.ts b/spec/observables/fromEvent-spec.ts index 668921dc8e..7cb870b988 100644 --- a/spec/observables/fromEvent-spec.ts +++ b/spec/observables/fromEvent-spec.ts @@ -119,6 +119,37 @@ describe('fromEvent', () => { expect(offHandler).to.equal(onHandler); }); + it('should setup an event observable on objects with "addListener" and "removeListener" and "length" ', () => { + let onEventName; + let onHandler; + let offEventName; + let offHandler; + + const obj = { + addListener: (a: string, b: Function) => { + onEventName = a; + onHandler = b; + }, + removeListener: (a: string, b: Function) => { + offEventName = a; + offHandler = b; + }, + length: 1 + }; + + const subscription = fromEvent(obj, 'click') + .subscribe(() => { + //noop + }); + + subscription.unsubscribe(); + + expect(onEventName).to.equal('click'); + expect(typeof onHandler).to.equal('function'); + expect(offEventName).to.equal(onEventName); + expect(offHandler).to.equal(onHandler); + }); + it('should error on invalid event targets', () => { const obj = { addListener: () => { diff --git a/src/internal/observable/fromEvent.ts b/src/internal/observable/fromEvent.ts index 6706d93418..63efd4bab9 100644 --- a/src/internal/observable/fromEvent.ts +++ b/src/internal/observable/fromEvent.ts @@ -193,11 +193,7 @@ function setupSubscription(sourceObj: FromEventTarget, eventName: string, handler: (...args: any[]) => void, subscriber: Subscriber, options?: EventListenerOptions) { let unsubscribe: () => void; - if (sourceObj && (sourceObj as any).length) { - for (let i = 0, len = (sourceObj as any).length; i < len; i++) { - setupSubscription(sourceObj[i], eventName, handler, subscriber, options); - } - } else if (isEventTarget(sourceObj)) { + if (isEventTarget(sourceObj)) { const source = sourceObj; sourceObj.addEventListener(eventName, handler, options); unsubscribe = () => source.removeEventListener(eventName, handler, options); @@ -209,6 +205,10 @@ function setupSubscription(sourceObj: FromEventTarget, eventName: string, const source = sourceObj; sourceObj.addListener(eventName, handler as NodeEventHandler); unsubscribe = () => source.removeListener(eventName, handler as NodeEventHandler); + } else if (sourceObj && (sourceObj as any).length) { + for (let i = 0, len = (sourceObj as any).length; i < len; i++) { + setupSubscription(sourceObj[i], eventName, handler, subscriber, options); + } } else { throw new TypeError('Invalid event target'); }