Skip to content

IteratorObserable's never termines when within Observable.merge #2476

Closed
severest/retrobot
#221
@memelet

Description

@memelet

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)

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugConfirmed bug

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions