From e57bbb73f135e508c2eef2cdaef93e879743f383 Mon Sep 17 00:00:00 2001 From: Nicholas Jamieson Date: Fri, 26 Jan 2018 15:37:36 +1000 Subject: [PATCH] fix(forkJoin): catch and forward selector errors (#3261) * test(forkJoin): add selector error test * fix(forkJoin): catch and forward selector errors Closes #3216 --- spec/observables/forkJoin-spec.ts | 14 ++++++++++++++ src/internal/observable/ForkJoinObservable.ts | 8 +++++++- 2 files changed, 21 insertions(+), 1 deletion(-) 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 = '^ ! '; 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); }