From 9a402979a9b53ea101a6e3dafc2c9aeb0fd5fc5d Mon Sep 17 00:00:00 2001 From: LongYinan Date: Tue, 11 Oct 2016 11:14:29 +0800 Subject: [PATCH 1/3] fix(operator/do): fix typings --- src/operator/do.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/operator/do.ts b/src/operator/do.ts index 652946fbec..afdc40fa04 100644 --- a/src/operator/do.ts +++ b/src/operator/do.ts @@ -48,7 +48,7 @@ import { TeardownLogic } from '../Subscription'; * @owner Observable */ /* tslint:disable:max-line-length */ -export function _do(next: (x: T) => void, error?: (e: any) => void, complete?: (this: Observable) => void): Observable; +export function _do(this: Observable, next: (x: T) => void, error?: (e: any) => void, complete?: () => void): Observable; export function _do(this: Observable, observer: PartialObserver): Observable; /* tslint:disable:max-line-length */ export function _do(this: Observable, nextOrObserver?: PartialObserver | ((x: T) => void), From 22d286a36d703523356e76f3e706fae6e58704e0 Mon Sep 17 00:00:00 2001 From: Ben Lesh Date: Fri, 14 Oct 2016 13:56:11 -0700 Subject: [PATCH 2/3] fix(IteratorObservable): Observables `from` generators will now finalize when subscription ends In order to model the behavior of `for..of` when consuming a Generator, if a `break` is hit in the `for..of`, `return()` is called on the generator and the generator will jump to a `finally` block if it has one. Observables created from generators will now have this same behavior. ```js Observable.from((function* () { try { yield 1; yield 2; yield 3; } finally { console.log('finalized'); } })()) .take(2) .subscribe(x => console.log(x)); // should log // 1 // 2 // finalized ``` fixes #1938 --- spec/observables/IteratorObservable-spec.ts | 63 +++++++++++++++++++++ src/observable/IteratorObservable.ts | 6 ++ 2 files changed, 69 insertions(+) diff --git a/spec/observables/IteratorObservable-spec.ts b/spec/observables/IteratorObservable-spec.ts index 3149f213a2..63b1d73761 100644 --- a/spec/observables/IteratorObservable-spec.ts +++ b/spec/observables/IteratorObservable-spec.ts @@ -1,5 +1,6 @@ import {expect} from 'chai'; import * as Rx from '../../dist/cjs/Rx'; +import {queue} from '../../dist/cjs/scheduler/queue'; import {IteratorObservable} from '../../dist/cjs/observable/IteratorObservable'; declare const expectObservable; @@ -46,6 +47,68 @@ describe('IteratorObservable', () => { ); }); + it('should finalize generators if the subscription ends', () => { + const iterator = { + finalized: false, + next() { + return { value: 'duck', done: false }; + }, + return() { + this.finalized = true; + } + }; + + const iterable = { + [Rx.Symbol.iterator]() { + return iterator; + } + }; + + const results = []; + + IteratorObservable.create(iterable) + .take(3) + .subscribe( + x => results.push(x), + null, + () => results.push('GOOSE!') + ); + + expect(results).to.deep.equal(['duck', 'duck', 'duck', 'GOOSE!']); + expect(iterator.finalized).to.be.true; + }); + + it('should finalize generators if the subscription and it is scheduled', () => { + const iterator = { + finalized: false, + next() { + return { value: 'duck', done: false }; + }, + return() { + this.finalized = true; + } + }; + + const iterable = { + [Rx.Symbol.iterator]() { + return iterator; + } + }; + + const results = []; + + IteratorObservable.create(iterable, queue) + .take(3) + .subscribe( + x => results.push(x), + null, + () => results.push('GOOSE!') + ); + + expect(results).to.deep.equal(['duck', 'duck', 'duck', 'GOOSE!']); + expect(iterator.finalized).to.be.true; + }); + it('should emit members of an array iterator on a particular scheduler', () => { const source = IteratorObservable.create( [10, 20, 30, 40], diff --git a/src/observable/IteratorObservable.ts b/src/observable/IteratorObservable.ts index 4195965f25..586afc6ad3 100644 --- a/src/observable/IteratorObservable.ts +++ b/src/observable/IteratorObservable.ts @@ -36,6 +36,9 @@ export class IteratorObservable extends Observable { state.index = index + 1; if (subscriber.closed) { + if (typeof iterator.return === 'function') { + iterator.return(); + } return; } @@ -71,6 +74,9 @@ export class IteratorObservable extends Observable { subscriber.next(result.value); } if (subscriber.closed) { + if (typeof iterator.return === 'function') { + iterator.return(); + } break; } } while (true); From 0ad575b13d19a2e72a4a1647c9005f4dca7e8db6 Mon Sep 17 00:00:00 2001 From: David Khourshid Date: Sat, 15 Oct 2016 22:42:40 -0400 Subject: [PATCH 3/3] Fix documentation to install `rxjs`, not `rxjs-es` Reference: https://github.com/ReactiveX/rxjs/pull/2019 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 642d3de6be..6cc8fd3c62 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ By contributing or commenting on issues in this repository, whether you've read ### ES6 via npm ```sh -npm install rxjs-es +npm install rxjs ``` To import the entire core set of functionality: