Skip to content

Commit b767fa7

Browse files
authored
Yield final value if one is given (#325)
1 parent b918489 commit b767fa7

1 file changed

Lines changed: 26 additions & 5 deletions

File tree

src/index.ts

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -558,7 +558,6 @@ export class SocketSdk {
558558
generator: AsyncGenerator<BatchPackageFetchResultType>
559559
promise: Promise<GeneratorStep>
560560
}
561-
type ResolveFn = (value: GeneratorStep) => void
562561

563562
const { chunkSize = 500, concurrencyLimit = 10 } = {
564563
__proto__: null,
@@ -593,14 +592,21 @@ export class SocketSdk {
593592
const continueGen = (
594593
generator: AsyncGenerator<BatchPackageFetchResultType>
595594
) => {
596-
let resolveFn: ResolveFn
595+
const {
596+
promise,
597+
resolve: resolveFn,
598+
reject:rejectFn
599+
} = promiseWithResolvers<GeneratorStep>();
597600
running.push({
598601
generator,
599-
promise: new Promise<GeneratorStep>(resolve => (resolveFn = resolve))
602+
promise
600603
})
601604
void generator
602605
.next()
603-
.then(iteratorResult => resolveFn!({ generator, iteratorResult }))
606+
.then(
607+
iteratorResult => resolveFn({ generator, iteratorResult }),
608+
rejectFn
609+
)
604610
}
605611
// Start initial batch of generators.
606612
while (running.length < concurrencyLimit && index < componentsCount) {
@@ -616,11 +622,14 @@ export class SocketSdk {
616622
running.findIndex(entry => entry.generator === generator),
617623
1
618624
)
625+
// Yield the value if one is given, even when done:true
626+
if (iteratorResult.value) {
627+
yield iteratorResult.value
628+
}
619629
if (iteratorResult.done) {
620630
// Start a new generator if available.
621631
enqueueGen()
622632
} else {
623-
yield iteratorResult.value
624633
// Keep fetching values from this generator.
625634
continueGen(generator)
626635
}
@@ -1118,3 +1127,15 @@ export class SocketSdk {
11181127
}
11191128
}
11201129
}
1130+
1131+
function promiseWithResolvers<T>(): ReturnType<typeof Promise.withResolvers<T>> {
1132+
if (Promise.withResolvers) {
1133+
return Promise.withResolvers<T>();
1134+
}
1135+
1136+
// This is what the above does but it's not available in node 20 (it is in node 22)
1137+
// @ts-ignore -- sigh.
1138+
const obj: ReturnType<typeof Promise.withResolvers<T>> = {};
1139+
obj.promise = new Promise<T>((resolver, reject) => { obj.resolve = resolver; obj.reject = reject; });
1140+
return obj;
1141+
}

0 commit comments

Comments
 (0)