Skip to content

Commit 4d2338b

Browse files
committed
feat(forkJoin): simplify interface
- removes resultSelector from forkJoin - updates tests
1 parent 582c7be commit 4d2338b

File tree

2 files changed

+9
-169
lines changed

2 files changed

+9
-169
lines changed

spec/observables/forkJoin-spec.ts

-133
Original file line numberDiff line numberDiff line change
@@ -42,22 +42,6 @@ describe('forkJoin', () => {
4242
expectObservable(e2).toBe(expected2, {x: [null, 'b', '3', undefined]});
4343
});
4444

45-
it('should join the last values of the provided observables with selector', () => {
46-
function selector(x: string, y: string, z: string) {
47-
return x + y + z;
48-
}
49-
50-
const e1 = forkJoin(
51-
hot('--a--b--c--d--|'),
52-
hot('(b|)'),
53-
hot('--1--2--3--|'),
54-
selector
55-
);
56-
const expected = '--------------(x|)';
57-
58-
expectObservable(e1).toBe(expected, {x: 'db3'});
59-
});
60-
6145
it('should accept single observable', () => {
6246
const e1 = forkJoin(
6347
hot('--a--b--c--d--|')
@@ -76,34 +60,6 @@ describe('forkJoin', () => {
7660
expectObservable(e1).toBe(expected, {x: ['d']});
7761
});
7862

79-
it('should accept single observable with selector', () => {
80-
function selector(x: string) {
81-
return x + x;
82-
}
83-
84-
const e1 = forkJoin(
85-
hot('--a--b--c--d--|'),
86-
selector
87-
);
88-
const expected = '--------------(x|)';
89-
90-
expectObservable(e1).toBe(expected, {x: 'dd'});
91-
});
92-
93-
it('should accept array of observable contains single with selector', () => {
94-
function selector(x: string) {
95-
return x + x;
96-
}
97-
98-
const e1 = forkJoin(
99-
[hot('--a--b--c--d--|')],
100-
selector
101-
);
102-
const expected = '--------------(x|)';
103-
104-
expectObservable(e1).toBe(expected, {x: 'dd'});
105-
});
106-
10763
it('should accept lowercase-o observables', () => {
10864
const e1 = forkJoin(
10965
hot('--a--b--c--d--|'),
@@ -153,22 +109,6 @@ describe('forkJoin', () => {
153109
expectObservable(e1).toBe(expected, {x: ['d', 'b', '3']});
154110
});
155111

156-
it('should accept array of observables with selector', () => {
157-
function selector(x: string, y: string, z: string) {
158-
return x + y + z;
159-
}
160-
161-
const e1 = forkJoin(
162-
[hot('--a--b--c--d--|'),
163-
hot('(b|)'),
164-
hot('--1--2--3--|')],
165-
selector
166-
);
167-
const expected = '--------------(x|)';
168-
169-
expectObservable(e1).toBe(expected, {x: 'db3'});
170-
});
171-
172112
it('should not emit if any of source observable is empty', () => {
173113
const e1 = forkJoin(
174114
hot('--a--b--c--d--|'),
@@ -244,34 +184,6 @@ describe('forkJoin', () => {
244184
expectObservable(e1).toBe(expected);
245185
});
246186

247-
it('should complete when any of source is empty with selector', () => {
248-
function selector(x: string, y: string) {
249-
return x + y;
250-
}
251-
252-
const e1 = forkJoin(
253-
hot('--a--b--c--d--|'),
254-
hot('---------|'),
255-
selector);
256-
const expected = '---------|';
257-
258-
expectObservable(e1).toBe(expected);
259-
});
260-
261-
it('should emit results by resultselector', () => {
262-
function selector(x: string, y: string) {
263-
return x + y;
264-
}
265-
266-
const e1 = forkJoin(
267-
hot('--a--b--c--d--|'),
268-
hot('---2-----|'),
269-
selector);
270-
const expected = '--------------(x|)';
271-
272-
expectObservable(e1).toBe(expected, {x: 'd2'});
273-
});
274-
275187
it('should raise error when any of source raises error with empty observable', () => {
276188
const e1 = forkJoin(
277189
hot('------#'),
@@ -290,20 +202,6 @@ describe('forkJoin', () => {
290202
expectObservable(e1).toBe(expected);
291203
});
292204

293-
it('should raise error when any of source raises error with selector with empty observable', () => {
294-
function selector(x: string, y: string) {
295-
return x + y;
296-
}
297-
298-
const e1 = forkJoin(
299-
hot('------#'),
300-
hot('---------|'),
301-
selector);
302-
const expected = '------#';
303-
304-
expectObservable(e1).toBe(expected);
305-
});
306-
307205
it('should raise error when source raises error', () => {
308206
const e1 = forkJoin(
309207
hot('------#'),
@@ -313,34 +211,6 @@ describe('forkJoin', () => {
313211
expectObservable(e1).toBe(expected);
314212
});
315213

316-
it('should raise error when source raises error with selector', () => {
317-
function selector(x: string, y: string) {
318-
return x + y;
319-
}
320-
321-
const e1 = forkJoin(
322-
hot('------#'),
323-
hot('-------b-|'),
324-
selector);
325-
const expected = '------#';
326-
327-
expectObservable(e1).toBe(expected);
328-
});
329-
330-
it('should raise error when the selector throws', () => {
331-
function selector(x: string, y: string) {
332-
throw 'error';
333-
}
334-
335-
const e1 = forkJoin(
336-
hot('--a-|'),
337-
hot('---b-|'),
338-
selector);
339-
const expected = '-----#';
340-
341-
expectObservable(e1).toBe(expected);
342-
});
343-
344214
it('should allow unsubscribing early and explicitly', () => {
345215
const e1 = hot('--a--^--b--c---d-| ');
346216
const e1subs = '^ ! ';
@@ -397,7 +267,6 @@ describe('forkJoin', () => {
397267
let c: Promise<boolean>;
398268
let d: Observable<string[]>;
399269
let o1: Observable<[number, string, boolean, string[]]> = forkJoin(a, b, c, d);
400-
let o2: Observable<boolean> = forkJoin(a, b, c, d, (aa, bb, cc, dd) => !!aa && !!bb && cc && !!dd.length);
401270
/* tslint:enable:no-unused-variable */
402271
});
403272

@@ -406,7 +275,6 @@ describe('forkJoin', () => {
406275
let a: Promise<number>[];
407276
let o1: Observable<number[]> = forkJoin(a);
408277
let o2: Observable<number[]> = forkJoin(...a);
409-
let o3: Observable<number> = forkJoin(a, (...x) => x.length);
410278
/* tslint:enable:no-unused-variable */
411279
});
412280

@@ -415,7 +283,6 @@ describe('forkJoin', () => {
415283
let a: Observable<number>[];
416284
let o1: Observable<number[]> = forkJoin(a);
417285
let o2: Observable<number[]> = forkJoin(...a);
418-
let o3: Observable<number> = forkJoin(a, (...x) => x.length);
419286
/* tslint:enable:no-unused-variable */
420287
});
421288

src/internal/observable/forkJoin.ts

+9-36
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,9 @@ export function forkJoin<T, T2, T3>(v1: ObservableInput<T>, v2: ObservableInput<
1313
export function forkJoin<T, T2, T3, T4>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>): Observable<[T, T2, T3, T4]>;
1414
export function forkJoin<T, T2, T3, T4, T5>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>): Observable<[T, T2, T3, T4, T5]>;
1515
export function forkJoin<T, T2, T3, T4, T5, T6>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, v6: ObservableInput<T6>): Observable<[T, T2, T3, T4, T5, T6]>;
16-
export function forkJoin<T, R>(v1: ObservableInput<T>, project: (v1: T) => R): Observable<R>;
17-
export function forkJoin<T, T2, R>(v1: ObservableInput<T>, v2: ObservableInput<T2>, project: (v1: T, v2: T2) => R): Observable<R>;
18-
export function forkJoin<T, T2, T3, R>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, project: (v1: T, v2: T2, v3: T3) => R): Observable<R>;
19-
export function forkJoin<T, T2, T3, T4, R>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, project: (v1: T, v2: T2, v3: T3, v4: T4) => R): Observable<R>;
20-
export function forkJoin<T, T2, T3, T4, T5, R>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, project: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => R): Observable<R>;
21-
export function forkJoin<T, T2, T3, T4, T5, T6, R>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, v6: ObservableInput<T6>, project: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => R): Observable<R>;
16+
export function forkJoin<T>(v1: ObservableInput<T>): Observable<T[]>;
2217
export function forkJoin<T>(sources: Array<ObservableInput<T>>): Observable<T[]>;
23-
export function forkJoin<R>(sources: Array<ObservableInput<any>>): Observable<R>;
24-
export function forkJoin<T, R>(sources: Array<ObservableInput<T>>, project: (...values: T[]) => R): Observable<R>;
25-
export function forkJoin<R>(sources: Array<ObservableInput<any>>, project: (...values: any[]) => R): Observable<R>;
2618
export function forkJoin<T>(...sources: Array<ObservableInput<T>>): Observable<T[]>;
27-
export function forkJoin<R>(...sources: Array<ObservableInput<any>>): Observable<R>;
2819
/* tslint:enable:max-line-length */
2920

3021
/**
@@ -132,20 +123,10 @@ export function forkJoin<R>(...sources: Array<ObservableInput<any>>): Observable
132123
* @name forkJoin
133124
* @owner Observable
134125
*/
135-
export function forkJoin<T, R>(...sources: Array<ObservableInput<T> |
136-
Array<ObservableInput<T>> |
137-
((...values: T[]) => R)>): Observable<R> {
138-
if (sources === null || arguments.length === 0) {
139-
return EMPTY;
140-
}
141-
142-
let resultSelector: (...values: T[]) => R = null;
143-
if (typeof sources[sources.length - 1] === 'function') {
144-
resultSelector = sources.pop() as ((...values: T[]) => R);
145-
}
146-
147-
// if the first and only other argument besides the resultSelector is an array
148-
// assume it's been called with `forkJoin([obs1, obs2, obs3], resultSelector)`
126+
export function forkJoin<T>(...sources: Array<ObservableInput<T> |
127+
Array<ObservableInput<T>>>): Observable<T[]> {
128+
// if the first and only other argument is an array
129+
// assume it's been called with `forkJoin([obs1, obs2, obs3])`
149130
if (sources.length === 1 && isArray(sources[0])) {
150131
sources = sources[0] as Array<ObservableInput<T>>;
151132
}
@@ -155,7 +136,7 @@ export function forkJoin<T, R>(...sources: Array<ObservableInput<T> |
155136
}
156137

157138
return new Observable(subscriber => {
158-
return new ForkJoinSubscriber(subscriber, sources as Array<ObservableInput<T>>, resultSelector);
139+
return new ForkJoinSubscriber(subscriber, sources as Array<ObservableInput<T>>);
159140
});
160141
}
161142
/**
@@ -169,8 +150,7 @@ class ForkJoinSubscriber<T, R> extends OuterSubscriber<T, T> {
169150
private haveValues = 0;
170151

171152
constructor(destination: Subscriber<R>,
172-
private sources: Array<ObservableInput<T>>,
173-
private resultSelector?: (...values: T[]) => R) {
153+
private sources: Array<ObservableInput<T>>) {
174154
super(destination);
175155

176156
const len = sources.length;
@@ -197,7 +177,7 @@ class ForkJoinSubscriber<T, R> extends OuterSubscriber<T, T> {
197177
}
198178

199179
notifyComplete(innerSub: InnerSubscriber<T, T>): void {
200-
const { destination, haveValues, resultSelector, values } = this;
180+
const { destination, haveValues, values } = this;
201181
const len = values.length;
202182

203183
if (!(innerSub as any)._hasValue) {
@@ -212,14 +192,7 @@ class ForkJoinSubscriber<T, R> extends OuterSubscriber<T, T> {
212192
}
213193

214194
if (haveValues === len) {
215-
let result: R | T[];
216-
try {
217-
result = resultSelector ? resultSelector(...values) : values;
218-
} catch (err) {
219-
destination.error(err);
220-
return;
221-
}
222-
destination.next(result);
195+
destination.next(values);
223196
}
224197

225198
destination.complete();

0 commit comments

Comments
 (0)