@@ -6,10 +6,12 @@ import { safeRace } from '../util/safeRace';
6
6
// eslint-disable-next-line @typescript-eslint/no-empty-function
7
7
const NEVER_PROMISE = new Promise ( ( ) => { } ) ;
8
8
9
- type MergeResult < T > = { value : T ; index : number } ;
9
+ type MergeResult < T > = { value : T ; index : number ; done ?: boolean , error ?: any } ;
10
10
11
- function wrapPromiseWithIndex < T > ( promise : Promise < T > , index : number ) {
12
- return promise . then ( ( value ) => ( { value, index } ) ) as Promise < MergeResult < T > > ;
11
+ function wrapPromiseWithIndex < T > ( promise : Promise < IteratorResult < T > > , index : number ) {
12
+ return promise
13
+ . then ( ( { value, done} ) => ( { value, done, index } ) )
14
+ . catch ( ( error ) => ( { error, index } ) ) as Promise < MergeResult < T > > ;
13
15
}
14
16
15
17
/** @ignore */
@@ -25,7 +27,7 @@ export class MergeAsyncIterable<T> extends AsyncIterableX<T> {
25
27
throwIfAborted ( signal ) ;
26
28
const length = this . _source . length ;
27
29
const iterators = new Array < AsyncIterator < T > > ( length ) ;
28
- const nexts = new Array < Promise < MergeResult < IteratorResult < T > > > > ( length ) ;
30
+ const nexts = new Array < Promise < MergeResult < T > > > ( length ) ;
29
31
let active = length ;
30
32
for ( let i = 0 ; i < length ; i ++ ) {
31
33
const iterator = wrapWithAbort ( this . _source [ i ] , signal ) [ Symbol . asyncIterator ] ( ) ;
@@ -34,18 +36,16 @@ export class MergeAsyncIterable<T> extends AsyncIterableX<T> {
34
36
}
35
37
36
38
while ( active > 0 ) {
37
- const next = safeRace ( nexts ) ;
38
- const {
39
- value : { done : done$ , value : value$ } ,
40
- index,
41
- } = await next ;
42
- if ( done$ ) {
43
- nexts [ index ] = < Promise < MergeResult < IteratorResult < T > > > > NEVER_PROMISE ;
39
+ const next = await safeRace ( nexts ) ;
40
+ if ( next . hasOwnProperty ( 'error' ) ) {
41
+ throw next . error ;
42
+ } else if ( next . done ) {
43
+ nexts [ next . index ] = < Promise < MergeResult < T > > > NEVER_PROMISE ;
44
44
active -- ;
45
45
} else {
46
- const iterator$ = iterators [ index ] ;
47
- nexts [ index ] = wrapPromiseWithIndex ( iterator$ . next ( ) , index ) ;
48
- yield value$ ;
46
+ const iterator$ = iterators [ next . index ] ;
47
+ nexts [ next . index ] = wrapPromiseWithIndex ( iterator$ . next ( ) , next . index ) ;
48
+ yield next . value ;
49
49
}
50
50
}
51
51
}
0 commit comments