Closed
Description
RxJS version:
5.2.0
Code to reproduce:
unit tests added to IteratorObservable-spec.js
it('should finalize generators when merged if the subscription ends', () => {
const iterator1 = {
finalized: false,
next() {
return { value: 'duck', done: false };
},
return() {
this.finalized = true;
}
};
const iterable1 = {
[Rx.Symbol.iterator]() {
return iterator1;
}
};
const iterator2 = {
finalized: false,
next() {
return { value: 'duck', done: false };
},
return() {
this.finalized = true;
}
};
const iterable2 = {
[Rx.Symbol.iterator]() {
return iterator2;
}
};
const results = [];
const i1 = IteratorObservable.create(iterable1)
const i2 = IteratorObservable.create(iterable2)
Rx.Observable.merge(i1, i2)
.take(3)
.subscribe(
x => results.push(x),
null,
() => results.push('GOOSE!')
);
// never even get here
expect(results).to.deep.equal(['duck', 'duck', 'duck', 'GOOSE!']);
expect(iterator1.finalized).to.be.true;
expect(iterator2.finalized).to.be.true;
});
Expected behavior:
See test
Actual behavior:
The test never terminates (until V8 runs out of memory that is).
*A simpler example
Given:
const myInfiniteIterator1 = ...
const myInfiniteIterator2 = ...
This terminates:
Rx.Observable.from(myInfiniteIterator1).take(3)
But this never terminates
Rx.Observable.merge(…Rx.Observable.from(myInfiniteIterator1, myInfiniteIterator2).take(3)