Skip to content

Commit e57bbb7

Browse files
cartantbenlesh
authored andcommitted
fix(forkJoin): catch and forward selector errors (#3261)
* test(forkJoin): add selector error test * fix(forkJoin): catch and forward selector errors Closes #3216
1 parent 99b4937 commit e57bbb7

File tree

2 files changed

+21
-1
lines changed

2 files changed

+21
-1
lines changed

spec/observables/forkJoin-spec.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,20 @@ describe('Observable.forkJoin', () => {
331331
expectObservable(e1).toBe(expected);
332332
});
333333

334+
it('should raise error when the selector throws', () => {
335+
function selector(x, y) {
336+
throw 'error';
337+
}
338+
339+
const e1 = Observable.forkJoin(
340+
hot('--a-|'),
341+
hot('---b-|'),
342+
selector);
343+
const expected = '-----#';
344+
345+
expectObservable(e1).toBe(expected);
346+
});
347+
334348
it('should allow unsubscribing early and explicitly', () => {
335349
const e1 = hot('--a--^--b--c---d-| ');
336350
const e1subs = '^ ! ';

src/internal/observable/ForkJoinObservable.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,13 @@ class ForkJoinSubscriber<T> extends OuterSubscriber<T, T> {
224224
}
225225

226226
if (haveValues === len) {
227-
const value = resultSelector ? resultSelector.apply(this, values) : values;
227+
let value: any;
228+
try {
229+
value = resultSelector ? resultSelector.apply(this, values) : values;
230+
} catch (err) {
231+
destination.error(err);
232+
return;
233+
}
228234
destination.next(value);
229235
}
230236

0 commit comments

Comments
 (0)