diff --git a/spec/observables/IteratorObservable-spec.ts b/spec/observables/IteratorObservable-spec.ts index c4927e1be0..922b25021f 100644 --- a/spec/observables/IteratorObservable-spec.ts +++ b/spec/observables/IteratorObservable-spec.ts @@ -47,6 +47,24 @@ describe('IteratorObservable', () => { ); }); + it('should get new iterator for each subscription', () => { + const expected = [ + Rx.Notification.createNext(10), + Rx.Notification.createNext(20), + Rx.Notification.createComplete() + ]; + + const e1 = IteratorObservable.create(new Int32Array([10, 20])).observeOn(rxTestScheduler); + + let v1, v2: Array>; + e1.materialize().toArray().subscribe((x) => v1 = x); + e1.materialize().toArray().subscribe((x) => v2 = x); + + rxTestScheduler.flush(); + expect(v1).to.deep.equal(expected); + expect(v2).to.deep.equal(expected); + }); + it('should finalize generators if the subscription ends', () => { const iterator = { finalized: false, diff --git a/src/observable/IteratorObservable.ts b/src/observable/IteratorObservable.ts index e25d766912..519a05540e 100644 --- a/src/observable/IteratorObservable.ts +++ b/src/observable/IteratorObservable.ts @@ -20,8 +20,6 @@ interface IteratorObservableState { * @hide true */ export class IteratorObservable extends Observable { - private iterator: Iterator; - static create(iterator: ArrayOrIterable | string, scheduler?: IScheduler): IteratorObservable { return new IteratorObservable(iterator, scheduler); } @@ -54,20 +52,21 @@ export class IteratorObservable extends Observable { (this).schedule(state); } - constructor(iterator: ArrayOrIterable | string, private scheduler?: IScheduler) { + constructor(private readonly iteratorObject: ArrayOrIterable | string, private scheduler?: IScheduler) { super(); - if (iterator == null) { + if (iteratorObject == null) { throw new Error('iterator cannot be null.'); + } else if (!iteratorObject[Symbol_iterator]) { + throw new TypeError('object is not iterable'); } - - this.iterator = getIterator(iterator); } protected _subscribe(subscriber: Subscriber): TeardownLogic { let index = 0; - const { iterator, scheduler } = this; + const { scheduler } = this; + const iterator = getIterator(this.iteratorObject); if (scheduler) { return scheduler.schedule(IteratorObservable.dispatch, 0, { @@ -136,7 +135,6 @@ function getIterator(obj: ArrayOrIterable | string): Iterator { if (isArrayLike(obj)) { return new ArrayIterator(obj); } - throw new TypeError('object is not iterable'); } return obj[Symbol_iterator](); }