Skip to content

Instantly share code, notes, and snippets.

@JhonSmith0
Created June 15, 2025 01:26
Show Gist options
  • Save JhonSmith0/23db405da7851cabdb754e15000a89e5 to your computer and use it in GitHub Desktop.
Save JhonSmith0/23db405da7851cabdb754e15000a89e5 to your computer and use it in GitHub Desktop.
type GeneratorOrAsyncGenerator =
| Generator<any, any, any>
| AsyncGenerator<any, any, any>;
type GeneratorOrAsyncGeneratorFunction = (...args: any[]) => GeneratorOrAsyncGenerator;
type GeneratorReturn<T> = T extends Generator<any, infer R, any> ? R : never;
type AsyncGeneratorReturn<T> = T extends AsyncGenerator<any, infer R, any> ? R : never;
type GeneratorTypeOfGeneratorFunction<T extends GeneratorOrAsyncGeneratorFunction> =
ReturnType<T> extends AsyncGenerator<any, any, any>
? AsyncGeneratorReturn<ReturnType<T>>
: ReturnType<T> extends Generator<any, any, any>
? GeneratorReturn<ReturnType<T>>
: never;
export function convertGeneratorToPromise<T extends GeneratorOrAsyncGeneratorFunction>(generatorFunction: T) {
return (...args: Parameters<T>): Promise<GeneratorTypeOfGeneratorFunction<T>> => {
return new Promise(async (resolve, reject) => {
const generator = generatorFunction(...args)
async function callNextRecursively() {
try {
const result = await generator.next()
if (result.done) {
resolve(result.value)
} else {
setImmediate(callNextRecursively)
}
} catch (e) {
reject(e)
}
}
callNextRecursively()
})
}
}
@JhonSmith0
Copy link
Author

Essa função utilitária convertGeneratorToPromise permite transformar funções generator (ou async generator) em funções async, com o objetivo principal de processar operações intensivas sem bloquear a thread principal.

A ideia é que você possa escrever uma função síncrona intensiva, convertê-la em um Generator, e então executá-la de forma assíncrona, com pausas controladas entre os passos usando setImmediate. Isso permite dividir o processamento em pequenos blocos e manter a responsividade do event loop.

✨ Benefícios:
Evita travamentos ou bloqueios na interface (em ambientes como Node.js ou Electron)

Útil para processar grandes volumes de dados, parsing, transformações ou loops pesados

Tipado com TypeScript para suportar Generator e AsyncGenerator de forma segura

🧠 Como funciona:
Você transforma uma função síncrona intensa em um Generator, com yield nos pontos de pausa

Usa convertGeneratorToPromise para executá-la como se fosse async, com pausas entre os ciclos

O loop interno usa setImmediate para liberar a thread entre cada passo

Exemlpo de conversão:
image

É muito melhor que:
image
Pois isso vai bloquear a thread

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy