From ea10cd486c61f7cdcfe0ffc3e7ce9ea1d5b6c45f Mon Sep 17 00:00:00 2001 From: Nicholas Jamieson Date: Fri, 26 Jan 2018 10:50:10 +1000 Subject: [PATCH 1/2] test(forkJoin): add selector error test --- spec/observables/forkJoin-spec.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/spec/observables/forkJoin-spec.ts b/spec/observables/forkJoin-spec.ts index f75642d8cb..e8f6647a74 100644 --- a/spec/observables/forkJoin-spec.ts +++ b/spec/observables/forkJoin-spec.ts @@ -331,6 +331,20 @@ describe('Observable.forkJoin', () => { expectObservable(e1).toBe(expected); }); + it('should raise error when the selector throws', () => { + function selector(x, y) { + throw 'error'; + } + + const e1 = Observable.forkJoin( + hot('--a-|'), + hot('---b-|'), + selector); + const expected = '-----#'; + + expectObservable(e1).toBe(expected); + }); + it('should allow unsubscribing early and explicitly', () => { const e1 = hot('--a--^--b--c---d-| '); const e1subs = '^ ! '; From c96f4d24c8f717016c5fc57ab6165329112e6250 Mon Sep 17 00:00:00 2001 From: Nicholas Jamieson Date: Fri, 26 Jan 2018 11:03:39 +1000 Subject: [PATCH 2/2] fix(forkJoin): catch and forward selector errors Closes #3216 --- src/internal/observable/ForkJoinObservable.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/internal/observable/ForkJoinObservable.ts b/src/internal/observable/ForkJoinObservable.ts index aaaaa3dde3..782baddf26 100644 --- a/src/internal/observable/ForkJoinObservable.ts +++ b/src/internal/observable/ForkJoinObservable.ts @@ -224,7 +224,13 @@ class ForkJoinSubscriber extends OuterSubscriber { } if (haveValues === len) { - const value = resultSelector ? resultSelector.apply(this, values) : values; + let value: any; + try { + value = resultSelector ? resultSelector.apply(this, values) : values; + } catch (err) { + destination.error(err); + return; + } destination.next(value); }